Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍Docker CLI 中 docker cp 常用命令。

1、docker cp 简介

docker cp是用来在容器和本地文件系统之间复制文件/文件夹,docker cp实用程序将 的内容复制SRC_PATHDEST_PATH. 可以从容器的文件系统复制到本地机器,或者相反,从本地文件系统复制到容器。如果-为SRC_PATH或指定了DEST_PATH,还可以将 tar 存档从 STDIN或 流式传输到STDOUTCONTAINER可以是正在运行或已停止的容器。SRC_PATHDEST_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_PATHDEST_PATH按照上述规则存在。如果SRC_PATH是本地的,并且是一个符号链接,则默认复制的是符号链接,而不是目标链接。要复制链接目标而不是链接,指定-L选项。

冒号(:)用作容器与其路径之间的分隔符。在本地机器上指定SRC_PATHDEST_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/devtmpfs下的资源,以及用户在容器中创建的挂载。但是,你仍然可以通过在docker exec中手动运行tar来复制这些文件。下面两个例子以不同的方式完成相同的工作(考虑SRC_PATHDEST_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_PATHSTDIN的内容作为tar存档流。该命令将tar的内容提取到容器文件系统中的DEST_PATH。此时DEST_PATH必须指定一个目录。使用- 作为 DEST_PATH将资源的内容作为tar存档流传递到STDOUT

4、选项说明

选项

默认

描述

--archive , -a

归档模式(复制所有uid/gid信息)

--follow-link , -L

始终跟随SRC_PATH中的符号link

--quiet , -q

在复制过程中抑制进度输出。如果没有终端连接,则自动抑制进度输出

--help

打印使用方法

推荐文档

相关文档

大家感兴趣的内容

随机列表