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 | 打印使用方法 |