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

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

简介

在这篇文章中,我们将讨论 “如何将文件以及目录从主机操作系统转移到Docker容器环境中”。对所有这些命令的需求是,很多时候,开发人员必须向Docker容器提供各种类型的文件,这些文件是配置文件、安全和认证文件、应用程序文件,以及更多。因此,这是一项非常简单而重要的任务,需要在Docker守护进程中创建或创建完Docker容器后执行。在创建Docker镜像和进一步从该镜像创建Docker容器时,也会用到一些命令。

命令的类型

在Docker容器上有两种类型的命令可以用来传输文件,一种是来自终端或CLI(命令行界面),另一种是在创建Docker文件时。我们也有一些Docker compose的范围来传输文件到Docker容器。

使用终端命令

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

主机到容器,容器到主机。

命令1:Docker cp

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

$docker run -itd --name cont1 busybox

输出

21e7886419a1c1475af4dcfcda868a43bd272537153f8dcfbd201a357305644e

现在容器已经被创建。

变化1 主机到容器

假设我们想把一个文本文件传输到从HOST到Docker Container的容器。

$nano test.txt

输入 text

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

现在使用下面的命令将其复制到 “cont1 “忙音盒容器。

命令的一般语法。 $ docker cp [source_path] [container:destination_path].

$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

使用 “CONTAINER ID”。

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

变体2:集装箱到主机

要将文件从容器复制到主机,请将上例中使用的[source_path]和[destination_path]反过来。

进入容器内,创建一个文件 “test2.txt”,并将其传输到HOST。

$docker exec -it cont1 sh

输出

/# vi test2.txt

输入 text

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容器cp

命令 “docker cp “也可以作为 “docker container cp “使用,下面我们实现了同样的功能。没有什么需要改变的,所有的步骤都差不多。

$docker container cp cont1:/test2.txt .

命令2:Docker Volumes

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

$docker volume ls

现在创建你自己的卷 “数据库”,可以用来连接到任何一个容器。

句法 – docker volume create

$docker volume create database

检查该卷是否被创建。

$docker volume ls

输出

DRIVER  VOLUME NAME
local   volume1
local   database
local   volume2

现在使用这个卷,并使用”-v “标签将其连接到一个容器。一般情况下

语法 – docker run -it -v volume-/container_directory image

$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 source_files_location destination_directory_path

默认情况下,如果给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://www.tutorialspoint.com/index.htm /usr/local/apache2/htdocs/

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

命令2:复制

这个命令没有变化,它很简单,只执行一个任务,即把提到的文件复制到目的地。它不像我们在ADD命令中看到的那样进行提取,也不能从网上下载。

复制

命令3:RUN

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

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

结论

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

  • 复制配置文件。

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

  • 为测试目的从网上复制。

  • 为测试目的从网上复制。

  • 将容器数据复制到主机上,用于袋装持久性数据。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程