docker cp 可在宿主机与容器间直接传文件,无需进入容器或依赖运行状态;核心是路径正确、方向明确,支持目录复制(-r)、权限保留(-a)、通配符(需引号)及符号链接处理(-L)。

用 docker cp 在宿主机和容器之间传文件,不需要进容器、不依赖运行状态,一条命令就能搞定。核心就两点:路径写对、方向分清。
从宿主机复制到容器
适用于更新配置、上传脚本、导入测试数据等场景。
- 基本格式:
docker cp <宿主机路径> <容器名或ID>:<容器内路径> - 目标路径以
/结尾(如/app/config/),Docker 会把它当目录处理,把源文件放进去;不加斜杠(如/app/config)则会被当作新文件名 - 复制整个目录必须加
-r,例如:docker cp -r ./conf/ web:/etc/nginx/conf.d/ - 容器内目标路径若不存在,Docker 只会自动创建最后一级目录(比如
/etc/nginx/conf.d不存在但/etc/nginx存在,它能建成功;如果/etc也不存在就会失败) - 确保容器内目标路径有写权限,常见于只读挂载或受限用户场景
从容器复制到宿主机
常用于提取日志、备份数据库文件、导出生成结果。
- 基本格式:
docker cp <容器名或ID>:<容器内路径> <宿主机路径> - 宿主机目标路径不存在且不带
/时,Docker 会把文件直接复制为该名字(例如./logs会被当成文件名,不是目录) - 想复制整个目录,同样要加
-r,例如:docker cp -r db:/var/lib/postgresql/data/backup/ ./pg-backup/ - 加
-a可保留原始权限、所有者和时间戳,适合需要严格还原的场景 - 容器路径支持通配符(如
*),但必须用引号包裹,例如:docker cp "db:/var/log/*.log" ./logs/
几个实用技巧和避坑点
避免因小细节导致复制失败或结果不符预期。
- 路径含空格或特殊字符时,宿主机和容器路径都要用单引号或双引号包裹,例如:
docker cp './my config.yaml' app:/app/config.yaml - 复制目录时注意语义:
docker cp ./data app:/tmp/→ 容器里得到/tmp/data;想把data下内容直接放进/tmp,应写成docker cp ./data/* app:/tmp/ - 容器内路径始终相对于根目录
/,不随容器WORKDIR变化 - 符号链接默认不展开,如需复制目标文件而非链接本身,加
-L - 大文件传输无内存压力,但若频繁操作,建议配合
tar流式处理(如docker exec app tar cf - /bigdir | tar xf - -C ./local)
常见组合用法示例
把命令用活,能省不少事。
- 定时备份日志:
0 * * * * docker cp -a myapp:/var/log/app/ /backup/logs/$(date +\%Y\%m\%d-\%H) - 批量传多个配置:
find ./configs -name "*.json" | xargs -I {} docker cp {} app:/app/configs/ - 更新配置后通知重载:
docker cp new.conf app:/etc/app.conf && docker exec app kill -HUP 1


















