如何使用 Docker cp 将文件复制到您的 Docker 容器

如果您需要从Docker主机复制文件到您的Docker容器,这个教程适合您。

在本教程中,您将学习使用各种方法将文件从Docker主机复制到Docker容器。

让我们开始吧!

先决条件

如果您想一步一步跟着做,请确保具备以下条件:

  • 在Linux主机上安装了Docker。本教程使用Docker v19.03.11。您可以通过运行docker version来确认您的Docker版本。

使用docker cp命令复制文件

要开始本教程,您将学习使用docker cp命令将文件从Docker主机复制到容器。docker cp命令在容器和Docker主机的本地文件系统之间相互复制文件或文件夹。

让我们学习如何使用 Docker cp 命令,附带一个示例。

1. 在本地机器上打开一个终端。

2. 使用 touch 命令创建一个名为 myfile.txt 的文件。 myfile.txt 将从 Docker 主机复制到容器中。

touch myfile.txt

3. 执行 docker run 命令。下面的 docker run 将在后台创建一个新容器。下面的命令包含下面描述的三个参数:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx 将是用于运行容器的镜像。
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. 使用 docker ps 命令验证 Docker 容器是否成功创建。在执行 docker ps 命令之后,您应该在属性 CONTAINER ID (在下面的示例中为 ccae4670f030) 下看到一个使用 NGINX 镜像生成的新值,确认容器已成功创建。

sudo docker ps
Verifying the docker container by running the docker ps command

在执行 Docker cp 命令之前,Docker cp 命令的语法为:

  • CONTAINER: SRC_PATH 指定容器的源路径。
  • DEST_PATH 是主机上的目标路径。
  • CONTAINER: DEST_PATH 是容器上的目标路径。

此外,您还可以在命令中使用以下参数添加 options

  • 使用档案或a-复制所有文件和文件夹的用户和主要组权限。
  • 使用L-指定L选项将允许将源路径中的任何符号链接复制到目标路径。
# 从容器复制到Docker主机的语法
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# 从Docker主机复制到容器的语法
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. 接下来,执行docker cp命令。 docker cp命令将把您之前创建的myfile.txt复制到容器的/usr/share目录中。ccae4670f030是要将myfile.txt复制到的容器ID。

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. 最后,通过运行带有/bin/bashdocker exec命令来SSH到运行的容器中,该命令用作Linux系统用户登录的默认shell。

  • i标志表示您想要打开一个交互式SSH会话到容器。 即使容器未附加,i标志也不会关闭SSH会话。
  • t标志分配一个伪TTY,必须用来交互式地运行命令。sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

当您运行docker exec时,您将看到您现在已连接到容器的shell。

SSH into the running container using docker exec command

7. 登录容器后,请使用ls命令验证是否已使用myfile.txt将文件复制到容器中。

  • ls是Unix和类Unix操作系统中用于列出计算机文件的命令。
  • grep将搜索usr/share目录中以字符串my开头的所有文件或文件夹。
Verifying the files in the container

使用DockerFile复制文件

在前一节中,您学会了通过运行Docker cp命令将文件复制到容器中的方法。如果您需要一次性复制多个文件怎么办?当然,运行多个命令会增加负担!为了解决运行多个cp命令的问题,为什么不尝试使用Dockerfile和COPY命令将文件或文件夹复制到容器中呢?

部署容器并使用Dockerfile复制文件/文件夹允许您省去在上一节中执行的手动复制步骤。Dockerfile是一个包含用户可以在命令行上调用的所有命令的文本文档,以组装镜像。

让我们创建一个Dockerfile,从中运行一个容器,最终复制文件。

1. 创建一个名为~/host-to-container-copy-demo的文件夹,然后更改(cd)工作目录到该文件夹。此文件夹将包含您在此演示中将要创建的所有文件。

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. 现在,创建两个文本文件,命名为myfile1.txtmyfile2.txt,将它们复制粘贴到文件中,并保存到~/host-to-container-copy-demo目录中。

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. 创建另一个文件,复制/粘贴下面的配置,并将文件保存为Dockerfile,放在~/host-to-container-copy-demo目录中。完成后,Docker 将使用此 DockerFile 运行所有必要的命令来构建一个新的 Docker 镜像,该镜像位于任何基础镜像之上。

下面的DockerFile包含了构建新容器的各种步骤/指令:

  • FROM FROM指令初始化了一个新的构建阶段,并为后续的指令设置了基础镜像。
  • COPY COPY命令将文件从主机(Docker 主机)复制到容器中。
# Dockerfile 指令,用于在基础镜像(ubuntu)之上创建新镜像
# 使用基础镜像 ubuntu:latest
FROM ubuntu:latest
# 将 myfile1.txt 复制到容器的 /usr/share 目录中
COPY myfile1.txt /usr/share
# 将 myfile2.txt 复制到容器的 /tmp 目录中
COPY myfile2.txt /tmp

4. 通过运行tree命令验证构建新镜像所需的所有文件。您应该在~/host-to-container-copy-demo目录下看到Dockerfile、myfile1.txt和myfile2.txt

Verifies files and folders using tree command

5. 接下来,通过运行docker build命令构建镜像。使用t标志为镜像updated_ubuntu_image打标签为latest.允许Docker从当前工作目录中选择所有必需的文件。

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. 现在,通过运行docker images命令验证新构建的镜像updated_ubuntu_image。注意REPOSITORY属性。此属性是在前一步骤中使用-t标志创建的标签。

sudo docker images
Repository Attribute

7. 最后,通过运行docker run命令使用新构建的镜像运行Docker容器。-it标志指示Docker分配一个伪终端连接到容器的标准输入。bash提供Linux系统用户登录的默认Shell。

sudo docker run -it updated_ubuntu_image bash

您将看到,您现在位于Docker容器的Bash shell中。

Running the container using docker run command.

8. 接下来,通过运行ls命令验证文件是否成功复制到容器中的目录/tmp/usr/share

Verifying the files if they are successfully copied on the container

使用Docker Volume命令挂载存储卷并访问文件

截止目前,您已经学会了使用两种不同的方法将文件从主机复制到容器,一种是使用 docker cp 命令,另一种是使用 DockerFile。这次,让我们学习如何使用 docker volume 命令轻松共享主机和容器之间的文件系统。

假设您仍然登录到终端:

1. 运行 docker volume create 命令在 Docker 主机上创建一个卷。以下命令将创建一个名为 my-vol 的卷。 sudo docker volume create my-vol

sudo docker volume create my-vol

2. 运行 docker volume ls 命令验证卷是否成功创建。 docker volume ls 命令列出了卷。运行 docker volume ls 命令后,您将在 VOLUME NAME 属性中看到 my-vol,确认卷已成功创建。

sudo docker volume ls
Listing the docker volumes

3. 接下来,使用 docker run 命令运行容器。

  • 名为 volume_testing 的容器使用 nginx:latest 镜像。
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. 验证之前创建的卷 my-vol 是否正确地挂载到容器上,可以使用 docker inspect 命令。 Docker inspect 命令 提供容器的信息。运行 docker inspect 命令后,将显示指定容器(volume_testing)的所有细节,包括挂载细节,如下所示。

sudo docker inspect volume_testing

下面,镜像快照确认了在主机上创建的卷(my-vol)已成功地挂载到容器的 /app 目录。

Verifying the volumes in the container

结论

在本教程中,您学习了从 Docker 主机复制文件或文件夹到容器的不同方法,例如使用 Docker cp 命令、Docker 卷命令和 Dockerfile。

那么,在从主机复制数据到 Docker 容器时,您下一步要使用哪种方法?

Source:
https://adamtheautomator.com/docker-cp/