docker 容器 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
.您可以从容器的文件系统复制到本地计算机,或者相反,从本地文件系统复制到容器。如果为或-
指定,您还可以从或 向传输 tar 存档
。可以是正在运行或已停止的容器。或可以是文件或目录。SRC_PATH
DEST_PATH
STDIN
STDOUT
CONTAINER
SRC_PATH
DEST_PATH
该docker cp
命令假定容器路径相对于容器的
/
(根)目录。这意味着提供初始正斜杠是可选的;该命令将compassionate_darwin:/tmp/foo/myfile.txt
和
compassionate_darwin:tmp/foo/myfile.txt
视为相同。本地计算机路径可以是绝对值或相对值。该命令将本地计算机的相对路径解释为相对于docker cp
运行的当前工作目录。
该cp
命令的行为类似于 Unixcp -a
命令,其中递归复制目录并保留权限(如果可能)。所有权设置为目标处的用户和主要组。例如,复制到容器的文件是使用UID:GID
root 用户创建的。复制到本地计算机的文件是使用UID:GID
调用该命令的用户的名称创建的docker cp
。但是,如果指定该-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
.如果在本地计算机路径中使用 a :
,则必须明确使用相对或绝对路径,例如:
`/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下的资源以及用户在容器中创建的挂载。但是,您仍然可以通过手动运行tar
来复制此类文件docker exec
。以下两个示例以不同的方式执行相同的操作(考虑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 -
使用tar 存档的内容-
作为流。该命令将 tar 的内容提取到容器的文件系统中。在这种情况下,必须指定一个目录。使用作为流的资源内容作为 tar 存档到.SRC_PATH
STDIN
DEST_PATH
DEST_PATH
-
DEST_PATH
STDOUT