Docker命令行参考(15) – docker cp在容器和本地文件系统之间复制文件

  1. Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  2.         docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  3.  
  4. Copy files/folders between a container and the local filesystem
  5.  
  6. Use '-' as the source to read a tar archive from stdin
  7. and extract it to a directory destination in a container.
  8. Use '-' as the destination to stream a tar archive of a
  9. container source to stdout.
  10.  
  11. Options:
  12.   -L, --follow-link   Always follow symbol link in SRC_PATH
  13.       --help          Print usage

docker cp命令复制SRC_PATH的内容到DEST_PATH。可以从容器文件系统复制文件到本地机器或是反过来,从本地文件系统复制文件到容器。如果SRC_PATH或DEST_PATH指定了破折号-,可以从STDIN读取tar归档文件或输出到STDOUT。容器可以是运行或停止状态。SRC_PATH或DEST_PATH可以是文件或目录。

docker cp命令假设容器paths是相对于容器的根目录的。这意味着初始的左斜杠是可选的;compassionate_darwin:/tmp/foo/myfile.txt和compassionate_darwin:tmp/foo/myfile.txt是一样的。本地机器paths可以是一个绝对的或相对的值。这个命令解析本地机器的相对路径为相对于docker cp运行的当前目录。

cp命令行为像Unix cp -a命令,递归复制目录及其权限。文件的所有者设置为目标的用户和主用户组。例如,复制到容器的文件以root用户UID:GID创建。复制到本地机器的文件以调用docker cp命令的用户的UID:GID创建。如果指定-L选项,docker cp则跟随在SRC_PATH的软链接。docker cp不会创建DEST_PATH父级目录。

假设路径分隔符为/,第一个参数为SRC_PATH,第二个为DEST_PATH,它们的行为如下:

  • SRC_PATH指定的是一个文件
    • DEST_PATH不存在
      • 文件保存到DEST_PATH文件
    • DEST_PATH不存在且以/结尾
      • Error condition: the destination directory must exist.
    • DEST_PATH存在且是一个文件
      • 源文件将覆盖目标文件
    • DEST_PATH存在且是一个目录
      • 文件使用原来文件名复制到这个目录
        SRC_PATH
  • SRC_PATH指定的是一个目录
    • DEST_PATH不存在
      • 先创建DEST_PATH这个目录,然后源目录的内容复制到这个目录
    • DEST_PATH存在且是一个文件
      • Error condition: cannot copy a directory to a file
    • DEST_PATH存在且是一个目录
      • SRC_PATH不以/结尾
        • 源目录复制到这个目录
      • SRC_PATH/结尾
        • 源目录的内容将复制到此目录

根据以上规则,命令要求SRC_PATH和DEST_PATH都存在。如果SRC_PATH是本地的软链接,默认下只复制软链接,不复制它指向的文件。要跟随这个软链接,指定-L选项。:冒号用来分隔CONTAINER和它的路径。

标签:容器Docker 发布于:2019-11-19 13:13:40