目录
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日