docker cp

命令

docker cp

描述

在本地文件系统和容器之间复制文件或目录。

docker cp 复制时的特性列表:

  • 可以将本地文件复制到容器中,也可以将容器中的文件复制到本地。
  • 复制命令是有方向的,他总是从 SRC_PATHDEST_PATH
  • 复制的的 SRC_PATHDEST_PATH 可以是文件,也可以是目录。
  • 复制过程时容器的状态可以是运行中,也可以是停止的。
  • 如果使用短横线 -,还可以在标准输入 STDIN 或标准输出 STDOUT 与文件路径之间镜像复制。
  • 复制的 DEST_PATH 的父目录不存在时,不会自动创建。

docker cp 命令假定是路径相对于容器的 /(根)目录,这意味着容器内的 PATH 是否带有/(左斜线,根)是可选的。例如 docker cp 时,容器里面的路径compassionate_darwin:/tmp/foo/myfile.txtcompassionate_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情况 描述
SRC_PATH 指定文件 DEST_PATH 不存在 文件在 DEST_PATH 路径下创建文件
SRC_PATH 指定文件 DEST_PATH 不存在并以 / 错误条件:目标目录必须存在。
SRC_PATH 指定文件 DEST_PATH 存在并且是一个文件 目标被源文件的内容覆盖
SRC_PATH 指定文件 DEST_PATH 存在并且是目录 使用以下文件中的基本名称将文件复制到此目录中 SRC_PATH
SRC_PATH 指定目录 DEST_PATH 不存在 DEST_PATH被创建为目录,并将源目录的内容复制到该目录中
SRC_PATH 指定目录 DEST_PATH 存在并且是一个文件 错误条件:无法将目录复制到文件
SRC_PATH 指定目录 DEST_PATH 存在并且是目录 SRC_PATH不以/.(即:斜杠后跟dot)结尾时。源目录复制到该目录
SRC_PATH 指定目录 DEST_PATH 存在并且是目录 SRC_PATH确实以/.(即:斜杠后跟dot)结尾.源目录的内容被复制到该目录中

由于以上要求,要求SRC_PATHDEST_PATH需要存在。如果SRC_PATH为local并且是符号链接,则默认情况下将复制符号链接而不是目标链接数据。要复制链接目标而不是链接,请指定-L选项。

冒号(:)用作容器 CONTAINER 和 PATH 之间的分隔符。您还可以:在指定 SRC_PATHDEST_PATH 在本地计算机上的路径时使用,例如file:name.txt。如果:在本地计算机路径中使用,则必须使用相对路径或绝对路径来进行显式显示,例如: /path/to/file:name.txt or ./file:name.txt 复制时不允许复制系统文件,例如: /proc/sys/devtmpfs,但是可以将这些目录挂载到容器中。

除了使用docker cp命令,您还可以通过tar命令结合docker exec来复制文件。下面的两个示例以不同的方式(考虑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 -

将tar存档的内容 - 用作 SRC_PATH 标准输入STDIN。该命令将tar的内容提取到 DEST_PATH 容器的文件系统中。在这种情况下,DEST_PATH必须指定目录。也可以使用 - 作为DEST_PATH 标准输出STDOU提供给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目录中。

docker cp96f7f14999ab:/www  /tmp/
  • 从主机往容器中拷贝

将主机/www/myweb 目录拷贝到容器 96f7f14999ab 的/www目录下。

docker cp /www/myweb  96f7f14999ab:/www/