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/ - 容器内目标路径需存在上级目录(比如
/etc/nginx要提前存在),否则只自动创建最后一级 - 确保容器内目标位置有写权限,尤其注意挂载卷或只读文件系统限制
从容器复制到宿主机
常用于提取日志、备份数据库文件、导出生成结果。
- 基本写法:
docker cp 容器名或ID:/容器内绝对路径 /宿主机路径 - 宿主机目标路径不存在且不带
/,Docker 会把它当文件名创建;若已存在为目录,则按原名存入其中 - 复制整个目录同样要加
-r,例如:docker cp -r db:/var/lib/postgresql/data/backup/ ./pg-backup/ - 加
-a可保留权限、所有者和时间戳,适合需要严格还原的场景 - 容器内路径支持通配符(如
*.log),但必须用引号包裹:docker cp "db:/var/log/*.log" ./logs/
路径与权限关键细节
很多失败其实卡在路径或权限上,不是命令本身有问题。
- 容器内路径始终是相对于
/的绝对路径,和容器的WORKDIR无关 - 宿主机或容器路径含空格或特殊字符,两边都得用单引号或双引号包裹,例如:
docker cp './my config.yaml' app:/app/config.yaml - 符号链接默认复制的是链接本身,加
-L才复制目标文件内容 - 复制目录时语义容易混淆:写
docker cp ./data app:/tmp/,结果是/tmp/data;想把data下内容直接放进/tmp,应写成docker cp ./data/* app:/tmp/
实用组合技巧
把基础命令稍作延伸,就能应对更多日常需求。
- 定时备份日志:
0 * * * * docker cp -a myapp:/var/log/app/ /backup/logs/$(date +\%Y\%m\%d) - 批量复制多个配置文件:
find ./configs/ -name "*.yaml" | xargs -I {} docker cp {} app:/app/configs/ - 大目录传输更稳:用
tar流式处理,避免临时磁盘压力:docker exec app tar cf - /bigdir | tar xf - -C ./local











