docker container cp
说明 | 在容器与本地文件系统之间复制文件/文件夹 |
---|---|
用法 | docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH |
别名 | docker cp |
说明
docker cp
工具将 SRC_PATH
的内容复制到 DEST_PATH
。您可以从容器的文件系统复制到本地机器,或反之,从本地文件系统复制到容器。如果在 SRC_PATH
或 DEST_PATH
中指定了 -
,您还可以从 STDIN
流式传输 tar 归档或将 tar 归档流式传输到 STDOUT
。CONTAINER
可以是正在运行或已停止的容器。SRC_PATH
或 DEST_PATH
可以是文件或目录。
docker cp
命令假定容器路径相对于容器的 /
(根)目录。这意味着可以省略开头的正斜杠;该命令将 compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_darwin:tmp/foo/myfile.txt
视为相同。本地机器路径可以是绝对路径或相对路径。该命令将本地机器的相对路径解释为相对于执行 docker cp
命令时的当前工作目录。
cp
命令的行为类似于 Unix 的 cp -a
命令,会递归复制目录并尽可能保留权限。所有权会设置为目标位置的用户和主要组。例如,复制到容器的文件会使用 root 用户的 UID:GID
创建。复制到本地机器的文件会使用调用 docker cp
命令的用户 UID:GID
创建。但是,如果指定了 -a
选项,docker cp
会将所有权设置为源位置的用户和主要组。如果指定了 -L
选项,docker cp
会跟踪 SRC_PATH
中的任何符号链接。如果 DEST_PATH
的父目录不存在,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
不以/.
结尾(即:*斜杠*后跟*点*)- 源目录将被复制到此目录中
SRC_PATH
以/.
结尾(即:*斜杠*后跟*点*)- 源目录的内容将被复制到此目录中
根据上述规则,该命令要求 SRC_PATH
和 DEST_PATH
存在。如果 SRC_PATH
是本地路径且是符号链接,默认会复制符号链接本身而不是其目标。要复制链接的目标而不是链接本身,请指定 -L
选项。
冒号 (:
) 用作 CONTAINER
及其路径之间的分隔符。在指定本地机器上的 SRC_PATH
或 DEST_PATH
路径时,也可以使用 :
,例如 file:name.txt
。如果在本地机器路径中使用 :
,则必须明确使用相对路径或绝对路径,例如
`/path/to/file:name.txt` or `./file:name.txt`
选项
选项 | 默认 | 说明 |
---|---|---|
-a, --archive | 归档模式(复制所有 uid/gid 信息) | |
-L, --follow-link | 始终跟踪 SRC_PATH 中的符号链接 | |
-q, --quiet | 复制期间抑制进度输出。如果没有连接终端,进度输出会自动抑制。 |
示例
将本地文件复制到容器
$ docker cp ./some_file CONTAINER:/work
从容器复制文件到本地路径
$ docker cp CONTAINER:/var/logs/ /tmp/app_logs
将文件从容器复制到 stdout。注意 cp
命令会生成一个 tar 流。
$ docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"
特殊情况
无法复制某些系统文件,例如 /proc
、/sys
、/dev
下的资源、tmpfs,以及用户在容器中创建的挂载。但是,您仍然可以通过在 docker exec
中手动运行 tar
来复制此类文件。以下两个示例以不同方式实现相同的功能(假设 SRC_PATH
和 DEST_PATH
是目录)
$ docker exec CONTAINER tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH -
$ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i CONTAINER tar Cxf DEST_PATH -
将 -
用作 SRC_PATH
会将 STDIN
的内容作为 tar 归档流式传输。该命令会将 tar 归档的内容提取到容器文件系统中的 DEST_PATH
。在这种情况下,DEST_PATH
必须指定一个目录。将 -
用作 DEST_PATH
会将资源的 内容作为 tar 归档流式传输到 STDOUT
。