docker cp 不支持自动同步,仅支持单向一次性复制,需手动执行两次命令实现“同步”;宿主机与容器间复制需注意路径写法、权限设置、目录递归及符号链接处理等细节。

docker cp 本身不支持自动同步,它只做单向、一次性复制。所谓“同步数据”,实际是靠你手动执行两次 docker cp:一次推过去,一次拉回来。关键不是功能多强大,而是路径写对、方向分清、细节留意。
宿主机 → 容器:推送配置或脚本
适合更新 Nginx 配置、上传启动脚本、注入测试数据等。
- 基本写法:
docker cp ./config.yaml web:/etc/nginx/conf.d/—— 注意末尾的 /,表示目标是目录,文件会以原名存入 - 想整个替换配置目录,加
-r:docker cp -r ./conf.d/ web:/etc/nginx/conf.d/ - 目标路径若不存在,Docker 只自动创建最后一级(比如
/etc/nginx/conf.d能建,但/etc/nginx/conf.d/test不会递归建全路径) - 容器内目标路径要有写权限;若服务以非 root 用户运行(如 nginx),复制后可能读不到——可提前在宿主机设好
chmod 644,或复制后进容器执行chown nginx:nginx /etc/nginx/conf.d
容器 → 宿主机:提取日志或备份结果
常用于拉取运行时生成的日志、数据库导出文件、临时生成的报告等。
- 基本写法:
docker cp db:/var/log/app.log ./logs/—— 宿主机目标路径末尾带 /,Docker 会当目录处理 - 复制整个目录必须加
-r:docker cp -r db:/var/lib/postgres/data/backup/ ./pg-backup/ - 加
-a可保留权限、属主和时间戳,对可执行脚本或严格权限的配置很重要 - 容器内路径支持通配符,但必须用引号包裹:
docker cp "db:/var/log/*.log" ./logs/
路径和权限避坑要点
很多失败不是命令错,而是路径或权限细节没注意。
- 路径含空格或特殊字符?宿主机和容器路径都得用单引号或双引号包住,比如:
docker cp './my config.yaml' app:/app/config.yaml - 符号链接默认复制的是链接本身,不是目标文件;要复制真实内容,加
-L - 容器内路径始终相对于根目录
/,跟容器的WORKDIR无关 - 复制目录时语义易混淆:
docker cp ./data app:/tmp/→ 容器里得到/tmp/data;想把data下所有内容放进/tmp,应写成docker cp ./data/* app:/tmp/
真需要双向实时同步?换方案
如果目标是开发中代码改了立刻生效、配置变动自动反映,docker cp 不合适。
- 推荐用绑定挂载(bind mount):
docker run -v $(pwd)/config:/app/config ...,文件系统级联动,无延迟 - 高频手动同步可封装脚本,比如用
inotifywait监听宿主机目录变化,触发docker cp推送 - 大文件或频繁传输,建议用
tar流式处理:docker exec app tar cf - /bigdir | tar xf - -C ./local,更高效且不占额外磁盘


















