需要将一些文件放入或取出 Docker 容器吗?该docker cp
命令允许您在主机和容器文件系统之间进行复制,以便您可以添加配置详细信息、创建备份和恢复现有数据。
基本语法
docker cp
接受源路径和目标路径作为它的两个参数:
docker cp example.txt 我的容器:/example.txt
这里example.txt
正在从工作目录复制到/example.txt
在my-container
容器中。您可以反转这两个参数以/example.txt
从容器中复制到您的工作目录中。
引用容器路径的参数需要以容器 ID 或名称为前缀,后跟冒号 ( :
)。您可以使用docker ps
.
每个docker cp
命令需要一个本地文件系统路径和一个容器路径——你不能直接在两个容器之间复制。如果需要,请使用多步骤过程,首先从源容器复制到文件系统,然后从新的本地路径复制到目标容器。
复制整个目录
docker cp
也可以递归复制目录:
docker cp /home/demo/website apache-container:/var/www/html/.
Docker 将复制所有内容/home/demo/website
并将其传输到/var/www/html
.
复制行为
当您复制文件时,Docker 会在目标位置创建一个新文件(如果该文件尚不存在)。现有文件将被新内容覆盖。当目标是一个目录时,文件将使用源文件名复制到其中。一个例外是当指定的目的地以 a 结尾时/
,表示一个目录,但路径不存在。在这种情况下,将引发错误。
目录副本的过程稍微复杂一些。如果目标路径不存在,将在目标位置创建一个包含源目录内容的新目录。当它确实存在时,行为会有所不同,具体取决于您是否/.
在路径中包含了尾随组件。
/.
is present – 源目录被复制到现有的目标目录中。/.
不存在 -源目录的内容被复制到目标中。
细微的区别决定了是否在目标内创建了一个新的子目录。
命令限制
尽管有它的名字,但docker cp
并不是cp
shell 命令的完整实现。cp
不支持这些标志,除了-a
和-L
:
-a
– 存档模式,保留复制文件的用户和组详细信息。-L
– 按照源目录中的符号链接复制链接目标的内容,而不是链接本身。
对于需要选择性复制的更高级用例,您需要回退到使用不同的方法。
使用绑定挂载复制文件
Docker 卷提供了另一种在容器和主机之间移动文件的方法。将本地目录绑定挂载到容器中,您可以从主机文件系统访问其内容,而无需使用docker cp
.
docker run -v /example/host/directory:/container/path my-image:latest
/example/host/directory
路径的内容被挂载到容器的文件系统中/container/path
。您可以使用熟悉的工具,如码头工人的这些文件之外的互动cp
,rsync
和你的图形文件浏览器。
此技术仅在您使用单个容器目录时才有用。当您从任意位置复制时,它不能很好地工作,因为您需要在创建容器时提前知道将使用的路径。
您还应该警惕文件系统权限:在容器内创建的文件通常由root
. 这可能会在主机上产生尴尬的情况,您无法编辑或删除绑定目录中的文件。chown
如有必要,使用主机上和容器内的命令根据环境切换所有权。
怎么样COPY
在Dockerfiles?
docker cp
有时会与COPY
Dockerfiles 中的指令混淆。重要的是要认识到这两个功能服务于非常不同的用例。
COPY
不能用于在主机和正在运行的容器之间移动文件。它用于在构建过程中将文件放入图像:
复制 /home/me/my-website /var/www/html/。
在这里,网站源代码作为构建的一部分被复制到图像中。这是一个一次性过程。从图像开始的每个容器都将包含您运行时的网站源docker build
。
docker cp
允许您在容器运行后用更新版本替换该源代码。COPY
指令用于使文件成为静态图像的一部分;cp
命令与实时容器交互。
何时使用 Docker 复制文件?
手动将文件从主机复制到 Docker 容器,反之亦然,应该是比较少见的情况。图像是自给自足的,因此它们应该包含启动实例所需的一切。配置通常通过环境变量处理。
需要持久存储数据的容器应该使用 Docker 卷。卷允许数据比任何单个容器的寿命更长,因此您无需docker cp
在替换实例之前手动进行操作。进行备份时,请从主机复制卷,而不是从容器中提取文件。
docker cp
在调试容器或在开发环境中工作时最有用。有时您需要手动注入临时配置文件或拉出隐藏的日志。使用docker cp
比每次更改代码时重新构建整个映像更快、更方便。
永远记住,复制到容器中的文件只会在容器存在期间持续存在。从同一个镜像启动另一个容器会给你一个干净的石板,没有你添加的文件docker cp
。
概括
docker cp
允许您在主机和 Docker 容器之间移动文件。它适用于文件和目录,但缺少基于 shell 的cp
命令中的大多数高级功能。
经常使用docker cp
表示可能偏离容器最佳实践。明智的做法是将其视为开发使用的便利工具,而不是使用容器的一个组成部分。应该使用卷来实现长期文件持久性,因为它们是 Docker 生态系统中的一流组件。