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/
其他注意事项
被操作的容器可以是运行状态,也可以是停止状态。
- Docker 守护进程会暂停目标容器的文件系统以确保一致性,复制大文件时可能引发短暂服务中断
- 不能复制
/proc、/sys、/dev、tmpfs等虚拟文件系统路径 -
docker cp不适用于跨主机传输,如需迁移,建议配合docker save+scp+docker load











