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 归档文件或流式传输到 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
将文件从容器复制到标准输出。注意 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。