0

我有一个关于.dockerignore工作流程的问题,在浏览文档和不同的 Internet 主题时我无法真正理解。

具有以下文件夹结构:

home
   |
   |- folder_1
   |- folder_2

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

COPY ./ /home

.dockerignore我有:

*
!folder_1
!folder_3

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

如果我尝试在不使用.dockerignore的情况下做同样的事情,以不存在的目录为目标,我会收到错误消息。

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

提前致谢!

4

2 回答 2

1

首先,.dockerignore.gitignore. 在这些文件中,您可以根据应该添加哪些文件以及不应该添加哪些文件来设置规则。

在您的场景中,您是由folder_1folder_2COPY组成的整个目录。您的文件设置了以下规则:.dockerignore

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

无论您的本地目录中是否存在folder_1或,它都不会显示任何错误,因为它只是尝试查找. 如果找到此文件/目录,则应用规则。如果它没有找到这个文件/目录,它不会对它做任何事情。folder_3.dockerignore

希望现在更清楚一点。

于 2021-06-30T07:20:16.783 回答
0

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

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

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

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

于 2021-06-30T10:04:54.760 回答