如何把文件从宿主机复制到 Docker 容器?
docker cp 宿主机路径 容器名:容器内路径 即可把文件拷入运行中的容器;目录整体拷贝用 源目录/. 写法;调试后可 docker commit 固化。本文给出用法与最佳实践。
做法:docker cp 源路径 <容器名>:/目标路径——把宿主机上的文件或目录拷进正在运行的容器,常用于调试时临时替换配置、注入证书或补丁文件。
基本用法
# 拷单个文件
docker cp ./app.conf myapp:/etc/app/app.conf
# 拷整个目录内容(注意结尾的 /.)
docker cp ./conf/. myapp:/etc/app/
目录写法中 src/. 表示"目录里的内容",目标目录不存在时会自动创建。
让改动生效
拷进去的配置文件通常需要让进程重读:
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:默认按容器内路径的属主语义写入,可用 docker cp -a 保留源文件权限位;必要时 docker exec 里 chown。
Q:能往已停止的容器拷文件吗?
A:可以,docker cp 对停止的容器同样有效。
Q:和 Dockerfile 的 COPY 有什么区别?
A:COPY 是构建镜像时打包进镜像层,永久生效;docker cp 是运行时写入容器可写层,容器一删就没。