如何把文件从 Docker 容器复制到宿主机?
用 docker cp 容器名:容器内路径 宿主机路径 即可把容器内文件拷到宿主机,运行中与已停止的容器都支持;批量目录用挂载卷更方便。本文给出用法与限制。
做法:docker cp <容器名或ID>:/容器内路径 /宿主机路径——一条命令把容器里的文件或目录拷到宿主机,容器在运行或已停止状态都可以。典型场景:取回容器内生成的日志、构建产物、配置文件做排查。
基本用法
# 拷单个文件
docker cp myapp:/var/log/app/error.log ./error.log
# 拷整个目录
docker cp myapp:/var/log/app ./app-logs
注意事项
- 容器无需运行:停止状态的容器同样能拷,适合抢救崩溃容器的现场文件。
- 特殊文件系统不能拷:
/proc、/sys、/dev、tmpfs 挂载点内的文件不在拷贝范围。 - 权限保持:拷贝以执行 docker 命令的用户身份落盘,文件属主可能变化,注意后续读取权限。
- 符号链接:
docker cp默认跟随容器内的符号链接解析真实文件。
替代方案:什么时候不该用 cp
- 持续共享文件(如日志持续产出)→ 用挂载卷
-v /host/logs:/var/log/app,宿主机实时可见 - 镜像内自带文件 → 直接从镜像取材:
docker create不启动容器 +docker cp,或重建镜像时 COPY 出来 - K8s 环境 → 用
kubectl cp pod/name:/path ./path -c 容器名
观测云对照
取日志不如直接采集。 与其事后 docker cp 抢救容器日志,不如让 DataKit 实时采集容器 stdout 与容器内日志文件:容器重启、漂移都不丢日志,还能边采集边解析检索。
常见问题(FAQ)
Q:docker cp 会受容器内进程写入影响吗?
A:拷贝瞬间是文件当时的内容,写一半的文件可能不完整;重要文件先让应用 flush/轮转再拷。
Q:能拷到远程另一台机器的 Docker 吗?
A:docker cp 只在本地 Docker 与本地文件系统之间工作;远程场景用 scp 接力或挂载共享存储。
Q:拷大目录慢怎么办?
A:docker cp 底层走 tar 流,目录大时可在容器内先打包压缩再拷单文件。