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中的任何符号链接。docker cp如果不存在,则不会为DEST_PATH创建父目录。
假设路径分隔符为/,第一个参数为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。