目录

Docker cp 教程:在主机与容器之间复制文件

docker cp 在主机与容器之间复制文件,容器运行中或已停止时都可以使用。

语法

docker cp [参数] 容器:来源路径 主机目的地     # 容器 → 主机
docker cp [参数] 主机来源路径 容器:目的地路径   # 主机 → 容器
参数说明
-a, --archive保留文件的所有者(uid/gid)信息
-L, --follow-link来源是符号链接时,复制它指向的实际文件
-q, --quiet不显示复制进度

将来源或目的地写成 -,可以用 tar 格式从标准输入读取或输出到标准输出。

示例

对一个名为 web 的 nginx 容器进行操作:

$ docker cp web:/etc/nginx/nginx.conf ./nginx.conf

$ head -n 3 nginx.conf

user  nginx;
worker_processes  auto;

$ echo "<h1>copied in</h1>" > page.html

$ docker cp page.html web:/usr/share/nginx/html/page.html

$ docker exec web cat /usr/share/nginx/html/page.html
<h1>copied in</h1>

$ docker cp web:/etc/nginx/conf.d ./confd

$ ls confd
default.conf

$ docker cp web:/no/such/file .
Error response from daemon: Could not find the file /no/such/file in container web
命令说明
docker cp web:/etc/nginx/nginx.conf ./nginx.conf将容器的配置文件复制到主机,常用于获取默认配置后再进行修改
docker cp page.html web:/usr/share/nginx/html/page.html将主机上的文件放入容器
docker cp web:/etc/nginx/conf.d ./confd复制整个文件夹。目的地 confd 不存在时,会创建该文件夹并放入文件夹中的内容
docker cp web:/no/such/file .来源不存在时显示的错误信息

复制文件夹的规则:

  • 目的地不存在:创建目的地文件夹,将来源文件夹的内容复制进去(如上例)。
  • 目的地已存在:将来源文件夹整体放入目的地中,成为 目的地/来源文件夹名称。
  • 来源路径末尾加上 /.(例如 web:/etc/nginx/conf.d/.):只复制内容,不包含文件夹本身。

什么时候使用 docker cp

适用场景:

  • 取出容器中的默认配置文件、日志、生成的文件。
  • 临时放入一个文件进行测试。
  • 在 Windows PowerShell 中备份和还原数据库:先在容器内导出为文件,再用 docker cp 取出,避开 PowerShell 不支持 < 和编码的问题(实测见常见错误信息)。

不适用场景:

  • 开发时同步代码:使用 Bind mount 或 docker compose watch(见 Node.js 应用)。
  • 需要保留的数据:使用 Volume。

相关章节

动手练习

练习:将 web 容器中 nginx 的欢迎页 /usr/share/nginx/html/index.html 复制到主机,修改标题后再复制回去,并用浏览器确认(容器需要使用 -p 8080:80 启动)。

答案
docker cp web:/usr/share/nginx/html/index.html ./index.html
# 用编辑器修改 index.html
docker cp ./index.html web:/usr/share/nginx/html/index.html

重新加载 http://localhost:8080 就会看到修改。删除容器后,修改就会消失。

常见问题

docker cp 可以用于已停止的容器吗?

可以。docker cp 直接读写容器的文件系统,容器停止时也能复制。这在容器启动失败、需要取出配置文件或日志进行检查时很有用。

用 docker cp 修改配置文件,重建容器后还在吗?

不在。复制进去的文件存在容器的可写层中,删除容器后就会消失。需要长期使用的文件,请用 Bind mount 挂载或写入镜像。

docker compose 有对应的命令吗?

有,docker compose cp 服务名称:路径 目的地,写法相同,用服务名称代替容器名称。

更新于 2026年10月14日