如何使用Docker Cp在主机和容器之间复制文件

如何使用Docker Cp在主机和容器之间复制文件

需要将一些文件放入或取出 Docker 容器吗?该docker cp命令允许您在主机和容器文件系统之间进行复制,以便您可以添加配置详细信息、创建备份和恢复现有数据。

基本语法

docker cp 接受源路径和目标路径作为它的两个参数:

docker cp example.txt 我的容器:/example.txt

这里example.txt正在从工作目录复制到/example.txtmy-container容器中。您可以反转这两个参数以/example.txt从容器中复制到您的工作目录中。

引用容器路径的参数需要以容器 ID 或名称为前缀,后跟冒号 ( :)。您可以使用docker ps.

如何使用Docker Cp在主机和容器之间复制文件

每个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并不是cpshell 命令的完整实现。cp不支持这些标志,除了-a-L

  • -a – 存档模式,保留复制文件的用户和组详细信息。
  • -L – 按照源目录中的符号链接复制链接目标的内容,而不是链接本身。

对于需要选择性复制的更高级用例,您需要回退到使用不同的方法。

使用绑定挂载复制文件

Docker 卷提供了另一种在容器和主机之间移动文件的方法。将本地目录绑定挂载到容器中,您可以从主机文件系统访问其内容,而无需使用docker cp.

docker run -v /example/host/directory:/container/path my-image:latest

/example/host/directory路径的内容被挂载到容器的文件系统中/container/path。您可以使用熟悉的工具,如码头工人的这些文件之外的互动cprsync和你的图形文件浏览器。

此技术仅在您使用单个容器目录时才有用。当您从任意位置复制时,它不能很好地工作,因为您需要在创建容器时提前知道将使用的路径。

您还应该警惕文件系统权限:在容器内创建的文件通常由root. 这可能会在主机上产生尴尬的情况,您无法编辑或删除绑定目录中的文件。chown如有必要,使用主机上和容器内的命令根据环境切换所有权。

怎么样COPY在Dockerfiles?

docker cp有时会与COPYDockerfiles 中的指令混淆。重要的是要认识到这两个功能服务于非常不同的用例。

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 生态系统中的一流组件。

正文完