如何在 Docker 容器中将文件从一个文件夹复制到另一个文件夹?


简介

在本文中,我们将讨论“如何将文件以及目录从主机操作系统传输到 Docker 容器环境”。所有这些命令的需求在于,开发人员很多时候需要向 Docker 容器提供各种类型的文件,这些文件包括配置文件、安全和身份验证文件、应用程序文件等等。因此,这是一个非常简单且重要的任务,在 Docker 守护进程上创建 Docker 容器时或创建之后都需要执行。在创建 Docker 镜像以及之后从该镜像创建 Docker 容器时,也需要使用一些命令。

命令类型

有两种类型的命令可用于 Docker 容器传输文件,一种是从终端或 CLI(命令行界面),另一种是在创建 Dockerfile 时。我们还有一些 Docker compose 的作用域可以将文件传输到 Docker 容器。

使用终端命令

为了在您的系统上实现这些命令,Docker 守护进程必须处于运行状态,因为这些命令是 Docker 客户端应用程序的基本命令。

主机到容器和容器到主机。

命令 1:Docker cp

首先,我们需要创建一个测试 Docker 容器,这里我们使用了 busybox Docker 镜像。使用此命令以交互式和分离模式创建容器。

$docker run -itd --name cont1 busybox

输出

21e7886419a1c1475af4dcfcda868a43bd272537153f8dcfbd201a357305644e

现在容器已创建。

变体 1:主机到容器

假设我们想要将一个文本文件传输到容器中,即从主机到 Docker 容器。

$nano test.txt

输入

HELLO FROM TUTORIALSPOINT.
This is a text file that has to be transferred to the Docker container.

现在使用以下命令将其复制到“cont1” busybox 容器。

命令的通用语法:$docker cp [源路径] [容器:目标路径]

$docker cp /home/hemant/test.txt cont1:/

现在交叉检查文件是否已复制到容器中。首先进入容器,然后检查文件。

$docker exec -it cont1 sh

示例

在终端上打印文件。

/#cat test.txt

输出

HELLO FROM TUTORIALSPOINT
This is a text file that has to be transferred to the Docker container.

示例

因此,文件已成功复制。除了使用 Docker 容器的名称外,我们还可以使用容器 ID 来复制文件。

$docker ps

输出

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21e7886419a1 busybox "sh" 10 hours ago Up 14 minutes cont1

使用“容器 ID”

$docker cp /home/hemant/test.txt 21e7886419a1:/

变体 2:容器到主机

要将文件从容器复制到主机,请反转上述示例中使用的 [源路径] 和 [目标路径]。

进入容器并创建一个文件“test2.txt”,然后将其传输到主机。

$docker exec -it cont1 sh

输出

/# vi test2.txt

输入

HELLO FROM INSIDE OF THE DOCKER CONTAINER.

现在退出容器并返回到主机终端,并执行以下命令以在主机计算机上获取该“test2.txt”文件。

$docker cp cont1:/test.txt .

检查文件

$cat test2.txt

输出

HELLO FROM INSIDE OF THE DOCKER CONTAINER.

因此,复制成功。

变体 3:Docker container cp

命令“docker cp”也可以用作“docker container cp”,下面我们实现了相同的操作。无需更改任何内容,所有步骤都类似。

$docker container cp cont1:/test2.txt .

命令 2:Docker 卷

另一种最常用的从容器获取文件副本的方法。这也有助于为容器创建持久性数据。列出系统上存在的所有 docker 卷。

$docker volume ls

现在创建您自己的卷“database”,该卷可用于连接到任何容器。

语法 - docker volume create <卷名称>

$docker volume create database

检查卷是否已创建。

$docker volume ls

输出

DRIVER  VOLUME NAME
local   volume1
local   database
local   volume2

现在使用此卷并使用“-v”标签将其连接到容器。通用

语法 - docker run –it –v 卷-/容器目录 镜像

$docker run -it --name cont2 -v database:/database busybox

让我们看看 docker 卷是否可以用于将数据从容器存储到主机。进入容器“cont2”,创建一个文本文件,然后退出容器。

$docker exec -it cont2 sh /#cd database /#touch databasefile.txt //exit the container $exit

现在让我们创建一个新的容器“cont3”,将同一个 docker 卷链接到此容器,然后检查 databasefile.txt 是否存在。

$docker run −itd --name cont3 -v database:/database busybox //get inside this container $docker exec -it cont3 sh //change to the database directory /#cd database //list the items /#ls Output: databasefile.txt

因此,数据已成功保存和复制。

使用 Dockerfile

Dockerfile 用于通过向其添加各种层来创建 docker 镜像。我们有一些层可以帮助将数据从主机或互联网复制或传输到容器镜像。

命令 1:ADD

ADD 命令可以用于不同的目的。

变体 1:解压缩文件。

通用语法 - ADD 源文件位置 目标目录路径

默认情况下,如果 ADD 给定的是压缩文件,则会在构建镜像时提取该文件并将其保存在容器镜像中。

ADD compressed_file.extension /container_folder_name

但是提取仅限于存储在主机上的源文件。它不会提取网络存储的压缩文件。并且它对提取的支持的扩展名也有限。

变体 2:从网络复制

通用语法与上面提到的相同,只是我们不必提供本地路径,而只需提供文件的远程路径位置。

ADD <remote_path_or_link_to_file> <destination_folder_on_container_image>

示例

假设我们想要将 Tutorialspoint 网站的 HTML 网页下载到我们的 apache webserver 以进行一些测试。我们使用以下 ADD 层。

ADD https://tutorialspoint.com/index.htm /usr/local/apache2/htdocs/

现在我们可以在 Docker 容器上运行此网页并执行测试。如果传递的链接是压缩文件,它不会提取文件,而是将其下载到提到的路径。

命令 2:COPY

此命令没有变体,它很简单,只执行将提到的文件复制到目标位置的任务。它不会像我们在 ADD 命令中看到的那样执行提取,并且它不能从网络下载。

COPY <源文件路径> <容器镜像上的目标位置>

命令 3:RUN

Curl 和 Wget 命令用于从网络复制文件。在使用 dockerfile 准备镜像时,我们将使用这些命令。

RUN curl --output <downloadedfile> <url_to_the_web_file>
RUN wget <url_to_the_web_file>

结论

从本地和远程机器复制的原因如下所示。

  • 复制配置文件。

  • 复制应用程序的实际代码。

  • 从网络复制以进行测试。

  • 从网络复制以进行测试。

  • 将容器数据复制到主机以实现持久性数据。

更新于: 2023年1月11日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告