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_PATHDEST_PATH 指定 -,你还可以从 STDIN 流式传输一个 tar 归档,或将 tar 归档流式传输到 STDOUTCONTAINER 可以是运行中的或已停止的容器。SRC_PATHDEST_PATH 可以是文件或目录。

docker cp 命令假定容器路径是相对于容器的 /(根)目录的。这意味着开头的斜杠是可选的;命令将 compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt 视为相同。本地机器路径可以是绝对路径或相对路径。该命令将本地机器的相对路径解释为相对于运行 docker cp 的当前工作目录。

cp 命令的行为类似于 Unix 的 cp -a 命令,即目录会递归复制,并且尽可能保留权限。所有权被设置为目标位置的用户和主组。例如,复制到容器的文件以根用户的 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_PATHDEST_PATH 存在。如果 SRC_PATH 是本地文件并且是符号链接,则默认复制符号链接本身,而不是目标。要复制链接目标而不是链接,请指定 -L 选项。

冒号(:)用作 CONTAINER 及其路径之间的分隔符。在指定本地机器上的 SRC_PATHDEST_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/devtmpfs 下的资源以及用户在容器中创建的挂载。但是,你仍然可以通过在 docker exec 中手动运行 tar 来复制此类文件。以下两个示例以不同的方式执行相同的操作(假设 SRC_PATHDEST_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_PATHSTDIN 的内容作为 tar 归档流式传输。该命令将 tar 的内容提取到容器文件系统中的 DEST_PATH。在这种情况下,DEST_PATH 必须指定一个目录。使用 - 作为 DEST_PATH 将资源的內容作为 tar 归档流式传输到 STDOUT

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.