1、docker cp 简介
docker cp
是用来在容器和本地文件系统之间复制文件/
文件夹,docker cp
实用程序将 的内容复制SRC_PATH
到DEST_PATH
. 可以从容器的文件系统复制到本地机器,或者相反,从本地文件系统复制到容器。如果-为SRC_PATH
或指定了DEST_PATH
,还可以将 tar
存档从 STDIN
或 流式传输到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
中的任何符号链接后面。如果DEST_PATH
不存在,docker cp
不会为它们创建父目录。
假设路径分隔符是/
,SRC_PATH
的第一个参数和DEST_PATH
的第二个参数,行为如下:
1)SRC_PATH
指定一个文件
若 DEST_PATH
不存在
创建 DEST_PATH
所需的文件夹,文件正常保存到 DEST_PATH
中
2)若 DEST_PATH
不存在,并以 /
结尾
错误:目标目录必须存在
3)若 DEST_PATH
存在并且是一个文件
目标被源文件的内容覆盖
4)若 DEST_PATH
存在并且是目录
使用 SRC_PATH
中的基本名称将文件复制到此目录中
5)SRC_PATH
指定目录
若 DEST_PATH
不存在
将 DEST_PATH
创建为目录,并将源目录的内容复制到该目录中
6)若 DEST_PATH
存在并且是一个文件
错误:无法将目录复制到文件
7)若 DEST_PATH
存在并且是目录
SRC_PATH
不以 /.
结尾,源目录复制到此目录
SRC_PATH
以 /.
结尾,源目录的内容被复制到该目录中
该命令要求SRC_PATH
和DEST_PATH
按照上述规则存在。如果SRC_PATH
是本地的,并且是一个符号链接,则默认复制的是符号链接,而不是目标链接。要复制链接目标而不是链接,指定-L
选项。
冒号(:
)用作容器与其路径之间的分隔符。在本地机器上指定SRC_PATH
或DEST_PATH
的路径时,也可以使用:
,例如file:name.txt
。如果在本地机器路径中使用:
,必须显式指定相对或绝对路径,例如:
`/path/to/file:name.txt`
或
`./file:name.txt`
2、docker cp 语法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
参考文档:https://docs.docker.com/engine/reference/commandline/cp/
3、docker cp 命令
1)复制一个本地文件到容器中
docker cp ./some_file CONTAINER:/work
2)从容器复制文件到本地路径
docker cp CONTAINER:/var/logs/ /tmp/app_logs
3)将一个文件从容器复制到标准输出。
docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"
注意:cp
命令会生成tar
流
4)极端情况
不能复制某些系统文件,例如/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
。
4、选项说明
选项 | 默认 | 描述 |
--archive , -a | 归档模式(复制所有uid/gid信息) | |
--follow-link , -L | 始终跟随SRC_PATH中的符号link | |
--quiet , -q | 在复制过程中抑制进度输出。如果没有终端连接,则自动抑制进度输出 | |
--help | 打印使用方法 |