如何把文件从宿主机复制到 Docker 容器?
docker cp 宿主机路径 容器名:容器内路径 即可把文件拷入运行中的容器;目录整体拷贝用 源目录/. 写法;调试后可 docker commit 保存可写层变更(不含挂载卷)。本文给出用法与最佳实践。
做法:docker cp 源路径 <容器名>:/目标路径——把宿主机上的文件或目录拷进正在运行的容器,常用于调试时临时替换配置、注入证书或补丁文件。
基本用法
# 拷单个文件
docker cp ./app.conf myapp:/etc/app/app.conf
# 拷整个目录内容(注意结尾的 /.)
docker cp ./conf/. myapp:/etc/app/
目录写法中 src/. 表示"目录里的内容",目标是否创建依文件/目录及末尾斜杠而定,docker cp 不会自动创建所有缺失的父目录,先确认目标父路径存在。
让改动生效
拷进去的配置文件通常需要让进程重读:
docker exec myapp nginx -s reload # 以 nginx 为例
# 或重启同一容器(可写层仍保留;删除重建才不同)
docker restart myapp
重要提醒:cp 进去的东西不持久
容器的可写层随容器删除而消失。docker cp 只适合临时调试;需要长期生效的改动应该:
- 改进镜像:把文件写进 Dockerfile 的
COPY指令,重建镜像 - 用挂载:
-v ./app.conf:/etc/app/app.conf或 named volume - 调试后固化:
docker commit myapp myapp:patched把可写层变更存成新镜像(不包含挂载卷数据)(应急可用,不推荐作为常规发布方式)
常见问题(FAQ)
Q:拷贝后容器内文件属主是谁?
A:复制到容器的文件默认通常为root:root,-a用于保留源UID/GID;权限位会尽可能保留;必要时 docker exec 里 chown。
Q:能往已停止的容器拷文件吗?
A:可以,docker cp 对停止的容器同样有效。
Q:和 Dockerfile 的 COPY 有什么区别?
A:COPY 是构建镜像时打包进镜像层,永久生效;docker cp 写入目标路径;普通路径在可写层中随删除消失,挂载路径则由卷/bind mount生命周期决定。