如何在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>
结论
从本地和远程机器复制的原因如下。
-
复制配置文件。
-
复制应用程序的实际代码。
-
为测试目的从网上复制。
-
为测试目的从网上复制。
-
将容器数据复制到主机上,用于袋装持久性数据。