docker cp可直接实现容器与宿主机间单向文件传输,不依赖容器运行状态,也无需进入容器;支持双向操作(需两次命令),路径须为绝对路径,复制目录需加-r,保留元数据可用-a。

直接用 docker cp 就能完成容器与宿主机之间的单向文件传输,它不依赖容器是否运行,也不需要进入容器内部,操作简单、稳定可靠。
从容器复制到宿主机
命令格式为:docker cp <容器名或ID>:<容器内路径> <宿主机目标路径>
- 容器内路径必须是绝对路径(以
/开头),比如/var/log/app.log或/app/config/ - 宿主机路径可以是相对路径(如
./logs)或绝对路径(如/home/user/backups) - 若宿主机目标路径不存在且末尾不带
/,Docker 会自动创建该路径并放入文件;若目标是已存在的目录,则文件按原名存入其中 - 复制整个目录时务必加
-r参数,例如:docker cp -r myapp:/app/config ./config-backup - 想保留权限和时间戳,可加
-a(等价于-p -L),例如:docker cp -a myapp:/etc/hosts ./hosts.bak
从宿主机复制到容器
命令格式为:docker cp <宿主机源路径> <容器名或ID>:<容器内目标路径>
- 容器内目标路径若不存在,Docker 仅自动创建最后一级目录(如
/tmp/import不存在,但/tmp存在,则import会被创建) - 目标路径末尾是否带
/很关键:带斜杠表示“当作目录处理”,否则会被视为新文件名 - 复制目录同样要加
-r,例如:docker cp -r ./data/ myapp:/tmp/import/ - 确保容器内目标路径有写入权限,否则复制失败(常见于只读文件系统或
/proc/sys 等受限路径)
路径写法与常见陷阱
容易出错的地方往往集中在路径细节上:
- 容器路径永远是绝对路径,不能写相对路径(如
./config无效,必须写/app/config) - 宿主机路径中不支持通配符(
*),但容器内路径支持(需用引号包裹,如"myapp:/var/log/*.log") - 复制时若提示 “no such file or directory”,先用
docker exec myapp ls /path/to/check验证容器内路径是否存在 - 批量传输多个文件,可用
find+xargs组合,例如:find ./configs -name "*.json" | xargs -I {} docker cp {} myapp:/app/configs/
适用场景与替代方案
docker cp 最适合临时、一次性传输,比如提取日志、更新配置、导出数据库备份。如果需要长期共享或实时同步,建议考虑其他方式:
- 开发调试阶段频繁改文件 → 用
-v挂载卷(docker run -v $(pwd)/src:/app/src) - 构建镜像时固定嵌入文件 → 在
Dockerfile中用COPY或ADD - 跨主机或大文件传输 → 结合
tar流式处理,避免内存占用过高


















