从 Docker 容器复制文件到主机


我们可以使用 Docker build 命令来使用构建上下文构建 Docker 镜像。构建上下文包含创建容器化应用程序环境所需的所有文件。这包括用于构建 Docker 镜像的 Dockerfile、应用程序的源代码、Dockerignore 文件,以及您希望在运行容器时预先存在的容器中的所有文件和目录。

但是,您可能希望将某些文件从容器复制到主机。例如,如果您正在 Docker 容器内处理应用程序,并且您在容器内生成了某些日志文件或输出。您可能希望与您的团队共享结果。在这种情况下,您需要从容器访问这些文件到主机。

有两种方法可以做到这一点。第一种是在主机上将目录挂载为卷。但是,对于共享简单文件或目录,创建卷可能没有必要。第二种方法是使用 Docker cp 命令将文件从 Docker 容器复制到主机。让我们讨论一下如何做到这一点。

Docker cp 命令

我们可以使用 Docker cp 命令将文件和目录从源路径复制到目标路径。我们可以使用此命令将文件从本地机器复制到 Docker 容器,反之亦然。参与此过程的容器可以是停止的或正在运行的。默认情况下,Docker cp 命令将假定容器内提到的所有路径都相对于容器的根目录(/)。

这意味着即使我们不提供正斜杠,它也是可选的。因此,路径 /user/app/folder1 和 user/app/folder1 是相同的。但是,我们为本地机器指定的路径可以是相对的也可以是绝对的。主机中的路径相对于当前工作目录。

我们可以在源和目标路径中为文件和目录指定两个路径。将文件从 Docker 容器复制到主机机的 Docker cp 命令语法为 -

$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

请注意,我们不允许复制某些敏感文件,例如系统文件。这些包括 /dev、/proc、/sys、tmpfs 下的资源,以及用户在容器中创建的某些挂载点。解决此问题的办法是使用 Docker exec 命令在 Docker 容器内手动执行 tar 命令。

让我们查看一个示例,在 Docker 容器内创建一个文件,在其中包含一些内容,并使用 Docker cp 命令将其复制到主机。

首先,让我们创建一个 Ubuntu 容器并访问其 bash。

$ docker run -it --name=myubuntu ubuntu bash

在上面的命令中,我们使用了 Docker run 命令来拉取并运行一个 Ubuntu 容器。我们使用了 i(交互式)和 t(伪 TTY)选项以及 Docker run 命令以交互模式访问容器。接下来,我们指定了镜像名称和我们需要运行的命令,即 bash 命令,因为我们希望访问容器环境。

现在我们已经可以访问容器的 bash 了,我们可以使用 echo 命令在容器内创建一个包含一些内容的文件。

# echo "Welcome to TutorialsPoint" > TutorialsPoint.txt

您可以通过列出文件并使用 cat 命令列出内容来验证文件的创建。

# ls
# cat TutorialsPoint.txt

现在,打开另一个终端。您可以让此容器继续运行或退出。在新终端中,让我们执行 Docker cp 命令将 TutorialsPoint.txt 文件从 ubuntu 容器复制到主机。

$ docker cp myubuntu:TutorialsPoint.txt /home/user/Desktop/

在上面的 Docker cp 命令中,我们指定了容器的名称和容器内文件的路径,用冒号分隔。我们还指定了主机中的目标路径。执行此命令后,文件将被复制到目标路径。

最终想法!

有多种方法可以将文件从 Docker 容器复制到主机。您可以使用挂载的卷、将镜像保存为 tarball 文件,以及各种其他技术。但是,如果您想复制小型文件或目录,最好的方法是使用 Docker cp 命令。它非常快且易于使用。除了某些重要的系统文件外,您可以从容器复制任何文件或目录。

在本文中,我们讨论了如何使用 Docker cp 命令以及它的语法和完整的端到端示例。

更新于: 2021年8月6日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告