docker cp 是 Docker 原生命令,支持宿主机与容器间单向复制,需两次操作实现“双向”;语法为 docker cp [源] [目标],路径可相对或绝对,容器可运行或停止;注意权限、目录处理(-r)、斜杠语义、通配符限制及元数据保留(-a/-L)。注意:“活体容器”不是 Docker 官方术语,实际指正在运行的容器。docker cp 本身不“同步”,而是单向、即时复制;所谓“同步资产”需手动执行双向操作,且无自动增量或监听机制。
想在宿主机和运行中的容器之间传输配置、日志、脚本等资产,docker cp 是最直接、无需额外依赖的原生命令。它不要求容器处于特定状态(运行中或已停止均可),但要注意路径写法、权限控制和目录处理逻辑——这些细节常导致复制失败或结果不符合预期。
从宿主机复制到运行中的容器
适用于推送新配置、替换脚本、注入临时数据等场景:
- 基本语法:
docker cp : - 目标路径以
/结尾(如/etc/nginx/conf.d/)→ 视为目录,文件将按原名放入其中 - 目标路径不带斜杠(如
/etc/nginx/nginx.conf)→ 视为完整目标文件名,会重命名 - 复制整个目录必须加
-r(如docker cp -r ./conf.d/ web:/etc/nginx/conf.d/) - 容器内目标目录若不存在,Docker 只创建最后一级(例如
/etc/nginx/conf.d会建,但/etc/nginx/conf.d/test不会递归建全路径)
从运行中的容器复制回宿主机
常用于提取日志、备份生成的配置、调试时拉取运行时文件:
- 基本语法:
docker cp : - 宿主机目标路径不存在时,Docker 自动创建最后一级目录(如
./logs/会建,./logs/app/2026/则只建2026/,上级需提前存在) - 容器内路径支持引号包裹的通配符(如
"*.log"),宿主机路径不支持通配符 - 建议加
-a保留权限、属主和时间戳,尤其对配置文件或可执行脚本很重要
保持权限与避免常见陷阱
权限错位、路径误判、符号链接处理不当是高频问题:
- 用
-a(等价于--archive)可同时保留权限、属主、时间戳、SELinux 上下文等元数据 - 若容器内目标路径属 root 且权限为
755,而宿主机文件属普通用户,复制后可能因权限不足被容器拒绝读取——建议提前在宿主机设好chmod 644或chown root:root - 符号链接默认不展开;如需复制链接指向的内容,加
-L - 路径中含空格或特殊字符,务必用单引号或双引号包裹整个路径段
替代方案:需要持续同步时考虑挂载卷
如果目标是开发阶段实时响应文件变更(比如代码热更新),docker cp 不适用。此时应使用绑定挂载(bind mount):
- 启动容器时用
-v /host/path:/container/path,宿主机与容器共享同一目录 - 修改宿主机文件,容器内立即可见;反之亦然(注意容器内程序是否支持文件监听)
- 挂载方式需提前规划权限(如加
:ro只读、:zSELinux 标签适配)











