docker cp¶
docker cp
是 Docker 中用于在容器与主机之间复制文件和目录的核心命令。它支持从容器复制文件到主机,或从主机复制文件到容器。本文详细解析了 docker cp
的使用方法、应用场景以及注意事项,帮助开发者和运维人员高效管理容器中的文件。
命令语法¶
docker cp
的基本语法如下:
描述¶
在本地文件系统和容器之间复制文件或目录。
docker cp
复制时的特性列表: - 可以将本地文件复制到容器中,也可以将容器中的文件复制到本地。 - 复制命令是有方向的,他总是从 SRC_PATH
到 DEST_PATH
。 - 复制的的 SRC_PATH
和 DEST_PATH
可以是文件,也可以是目录。 - 复制过程时容器的状态可以是运行中,也可以是停止的。 - 如果使用短横线 -
,还可以在标准输入 STDIN
或标准输出 STDOUT
与文件路径之间镜像复制。 - 复制的 DEST_PATH
的父目录不存在时,不会自动创建。
该 docker cp
命令假定是路径相对于容器的 /
(根)目录,这意味着容器内的 PATH 是否带有 /
(左斜线,根)是可选的。例如 docker cp
时,容器里面的路径compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_darwin:tmp/foo/myfile.txt
是一样的。
本地机器路径是绝对路径或相对路径都可以,当使用相对路径时会以当前执行 docker cp
命令时的目录为当前的相对路径。
复制时类似于 Unix 系统中cp -a
命令,将以递归方式复制目录并保留 UID:GID 权限。
默认情况下,本地文件复制到容器中,会保留文件的 UID:GID 权限。由容器中复制到本地时,UID:GID 是系统赋予docker cp
命令执行者的权限,即不一定和容器里面设置的完全一样。
假设路径分隔符为 /
,的第一个参数 SRC_PATH
和的第二个参数 DEST_PATH
,其行为如下:
- SRC_PATH 指定文件
- DEST_PATH 不存在 : 文件在 DEST_PATH 路径下创建文件
- DEST_PATH 不存在并以 / 结尾 : 错误条件:目标目录必须存在
- DEST_PATH 存在并且是一个文件 : 目标被源文件的内容覆盖
- DEST_PATH 存在并且是目录 : 复制到此目录中,使用 SRC_PATH 基本名称
- SRC_PATH 指定目录
- DEST_PATH 不存在 : DEST_PATH 被创建为目录,并将源目录的内容复制到该目录中
- DEST_PATH 存在并且是一个文件 : 错误条件:无法将目录复制到文件
- DEST_PATH 存在并且是目录,SRC_PATH 不以
/.
(即:斜杠后跟点)结尾时 : 源目录复制到该目录 - DEST_PATH 存在并且是目录,SRC_PATH 确实以
/.
(即:斜杠后跟点)结尾 : 源目录的内容被复制到该目录中
由于以上要求,要求 SRC_PATH
及 DEST_PATH
需要存在。如果 SRC_PATH
为 local 并且是符号链接,则默认情况下将复制符号链接而不是目标链接数据。要复制链接目标而不是链接,请指定 -L
选项。
冒号(:
)用作容器 CONTAINER 和 PATH 之间的分隔符。您还可以:在指定 SRC_PATH
或 DEST_PATH
在本地计算机上的路径时使用,例如file:name.txt
。如果:在本地计算机路径中使用,则必须使用相对路径或绝对路径来进行显式显示,例如: /path/to/file:name.txt
or ./file:name.txt
复制时不允许复制系统文件,例如:/proc
,/sys
,/dev
,tmpfs
,但是可以将这些目录挂载到容器中。
除了使用docker cp
命令,您还可以通过tar
命令结合docker exec
来复制文件。下面的两个示例以不同的方式(考虑SRC_PATH
及DEST_PATH
属于目录)执行相同的操作:
-
用作 SRC_PATH
标准输入 STDIN。该命令将 tar 的内容提取到 DEST_PATH
容器的文件系统中。在这种情况下,DEST_PATH
必须指定目录。也可以使用 -
作为 DEST_PATH
标准输出 STDOUT 提供给 tar 归档。 帮助¶
$ docker cp --help
Usage:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Copy files/folders between a container and the local filesystem
Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH
选项¶
参数, 简写 | 默认值 | 描述 |
---|---|---|
--archvier, -a | - | 复制文件所有数据,包括数据和 UID/GIG 信息。 |
--follow-link, -L | - | 保持源目标中的链接 |
示例¶
- 将容器中文件拷往主机
将容器 96f7f14999ab 的 /www 目录拷贝到主机的 /tmp 目录中。
- 从主机往容器中拷贝
将主机 /www/myweb 目录拷贝到容器 96f7f14999ab 的 /www 目录下。
参考¶
https://docs.docker.com/engine/reference/commandline/cp/
参数说明¶
- CONTAINER:目标容器的名称或ID。
- SRC_PATH:源文件或目录的路径。
- DEST_PATH:目标文件或目录的路径。
- OPTIONS:可选参数,目前
docker cp
命令没有额外的选项。
应用场景¶
docker cp
命令在以下场景中非常实用:
-
从容器中导出日志文件
将容器中的日志文件复制到主机,便于进一步分析和排查问题。 -
更新容器配置文件
将主机上的配置文件复制到容器中,快速更新服务配置。 -
开发与调试
在开发和调试过程中,快速传输测试数据或代码到容器中。 -
备份容器数据
将容器中的重要数据复制到主机进行备份。
使用示例¶
示例 1:从容器复制文件到主机¶
将容器 my_container
中的 /app/logs/error.log
文件复制到主机的 /tmp
目录:
示例 2:从主机复制文件到容器¶
将主机上的 /home/user/config.yml
文件复制到容器 my_container
的 /app/config/
目录:
示例 3:复制目录¶
将容器 my_container
中的 /app/data
目录复制到主机的 /backup
目录:
注意事项¶
-
容器状态
容器必须处于运行状态或已停止状态,否则无法执行复制操作。 -
路径格式
路径需使用绝对路径,避免因相对路径导致的错误。 -
大文件传输
复制大文件时可能影响容器性能,建议在非高峰期操作。 -
权限问题
确保目标路径具有足够的读写权限,否则可能导致复制失败。
总结¶
通过本文,您可以快速掌握 docker cp
命令的使用技巧,并了解其在实际工作中的应用场景和注意事项。无论是日志导出、配置文件更新,还是开发调试,docker cp
都是一个高效且实用的工具。