如何将文件从主机复制到 Docker 容器?

如果您有一个正在运行的 Docker 容器,并且想要将文件从主机复制到 Docker 容器,有几种方法可以做到。一种方法是在 Dockerfile 中使用 ADD 或 COPY 指令,并在启动容器时传递您希望在容器中的文件的路径。但是如果你已经有一个容器在运行,会发生什么呢?仅仅为了其中包含一个小文件而一次又一次地构建相同的图像是不可行的。

为了避免这种惨败,一旦我们从镜像创建了容器,Docker 允许我们使用几种不同的方法和命令将文件从主机复制到容器。在本文中,我们将讨论实现此目的的不同方法。让我们来看看它们中的每一个。

方法一、使用Docker cp命令

Docker cp 命令可用于将文件和目录从主机复制到容器,反之亦然。要将单个文件从主机复制到容器,您可以使用以下命令。

$ docker cpfile.txtcontainer-name:/path/to/copy/file.txt

您也可以使用容器 ID。要查找容器的名称或 ID,您可以列出所有容器。

$ docker ps -a

如果你想将宿主机的一个文件夹中的多个文件复制到容器中,可以使用以下命令。

$ docker cp src/directory/. container-name:/target/directory/location

方法二:挂载主机目录

另一种将文件从主机复制到容器的方法是在创建容器时将目录从主机挂载到 Docker 容器。这样就可以直接复制任何文件或目录,将文件复制到宿主机的挂载文件夹中。让我们看看如何做到这一点。

$ docker run -d -v /path/to/directory/in/host:/mount --name=<container-name> <image name>

您可以在主机中运行此命令来运行容器,并使用 -v 选项将主机中的目录挂载到容器中。您在此目录中复制的任何文件都可以被容器内的挂载目录访问。

现在,让我们尝试通过使用 Docker exec 命令运行 bash 命令来访问容器的 bash。

$ docker exec -it <container-name> bash

现在您可以访问容器的 bash,您可以运行以下命令来复制文件。

$ cp /mnt/sourcefile /path/to/destfile

方法 3. 使用 Cat 命令

在创建容器时复制文件的另一种相当简单的方法是使用 cat 命令作为 Docker run 命令的参数。

$ docker run -i ubuntu /bin/bash -c 'cat > filetobecopied' < filetobecopied

如果您已经有一个 Docker 容器在运行,您可以将 Docker exec 命令与相同的 cat 命令一起使用。

$ docker exec -it <container-name> bash -c 'cat > /path/to/docker-container/file.txt' <
/path/to/host-machine/file.txt

方法 4. 使用 tar 命令

您还可以使用 tar 命令将文件转换为 tarball 文件,并使用 Docker exec 命令对其进行管道传输。下面的命令将file.txt文件复制到容器内的 /usr 目录。

$ tar -cfile.txt| docker exec -i docker-container /bin/tar -C /usr -x

总而言之,在本文中,我们讨论了 4 种将文件从主机复制到 Docker 容器的不同方法。我们看到了如何将文件从主机复制到正在运行的容器以及尚未创建的容器。我们使用了Docker cp、Docker exec等工具来完成这个任务。最好的方法是使用传统的 Docker cp 命令。根据您的要求和用例,您可以选择复制文件的最佳方式。