.dockerignore 工作流程不清楚

.dockerignore workflow unclear

我有一个关于 .dockerignore 工作流程的问题,我在浏览文档和不同的互联网主题时并没有真正理解它。

具有以下文件夹结构:

home
   |
   |- folder_1
   |- folder_2

在我的 dockerfile 中,我想复制 home 目录的内容,所以我使用

COPY ./ /home

里面 .dockerignore 我有:

*
!folder_1
!folder_3

我指的是一个不存在的文件夹 - folder_3,应该是复制的,对吧? 我 运行 它看起来没有问题,因此 .dockerignore 以某种方式处理了这种情况。

如果我尝试在不使用 .dockerignore 的情况下做同样的事情,目标是一个不存在的目录,我会得到一个错误。

如果有人可以清除此工作流程,或者如果重复,请附上一些信息以便我进行自我教育。

提前致谢!

首先,.dockerignore 的工作方式类似于 .gitignore。在这些文件中,您可以根据哪些文件应该添加哪些文件不应该设置规则。

在您的场景中,您 COPY 整个 home 目录,其中包含 folder_1folder_2。您的 .dockerignore 文件设置了以下规则:

*           # ignore all files/directories
!folder_1   # do not ignore folder_1
!folder_3   # do not ignore folder_3

不管你本地home目录下有没有folder_1folder_3,它都不会显示任何错误,因为它只是试图找到 .dockerignore 中的特定 files/directories。如果找到 file/directory,它会应用规则。如果它没有找到这个 file/directory,它不会对它做任何事情。

希望现在更清楚了。

您偶尔会看到对 Docker 构建上下文 的引用。构建有两个步骤:

  1. docker build 客户端应用程序为其目录参数创建一个 tar 文件,并在 HTTP 请求中将其发送到 Docker 守护程序。
  2. Docker 守护程序解压缩 tar 文件,在其中找到 Dockerfile,然后使用给定的文件内容运行它。

.dockerignore 只影响第一步:它阻止 docker build 发送 Docker 守护程序特定文件。 .dockerignore 文件不要求有一个 folder_3 目录,它只是说如果有一个它不应该被排除在外。 Docker 守护进程端的第二步根本不使用 .dockerignore,当你 COPY . /somewhere 时它会复制整个构建上下文;也就是说,API 请求中发送的任何内容。

此工作流有几个实际结果。如果你有一个非常大的本地目录,将它发送到 Docker 守护进程可能需要一些时间,并且 Docker 守护进程在构建期间保留了它的副本,因此通常值得 .dockerignore 你的 .git 目录和构建树。此设置也是 docker build 在不同系统或 VM 中与 Docker 守护程序一起工作的方式,这就是为什么如果您尝试按名称 COPY 不存在的文件( COPY folder_3 somewhere) 您收到一条引用 Docker-内部路径的错误消息。