.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_1 和 folder_2。您的 .dockerignore
文件设置了以下规则:
* # ignore all files/directories
!folder_1 # do not ignore folder_1
!folder_3 # do not ignore folder_3
不管你本地home目录下有没有folder_1
或folder_3
,它都不会显示任何错误,因为它只是试图找到 .dockerignore
中的特定 files/directories。如果找到 file/directory,它会应用规则。如果它没有找到这个 file/directory,它不会对它做任何事情。
希望现在更清楚了。
您偶尔会看到对 Docker 构建上下文 的引用。构建有两个步骤:
docker build
客户端应用程序为其目录参数创建一个 tar 文件,并在 HTTP 请求中将其发送到 Docker 守护程序。
- 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-内部路径的错误消息。
我有一个关于 .dockerignore 工作流程的问题,我在浏览文档和不同的互联网主题时并没有真正理解它。
具有以下文件夹结构:
home
|
|- folder_1
|- folder_2
在我的 dockerfile 中,我想复制 home 目录的内容,所以我使用
COPY ./ /home
里面 .dockerignore 我有:
*
!folder_1
!folder_3
我指的是一个不存在的文件夹 - folder_3,应该是复制的,对吧? 我 运行 它看起来没有问题,因此 .dockerignore 以某种方式处理了这种情况。
如果我尝试在不使用 .dockerignore 的情况下做同样的事情,目标是一个不存在的目录,我会得到一个错误。
如果有人可以清除此工作流程,或者如果重复,请附上一些信息以便我进行自我教育。
提前致谢!
首先,.dockerignore
的工作方式类似于 .gitignore
。在这些文件中,您可以根据哪些文件应该添加哪些文件不应该设置规则。
在您的场景中,您 COPY
整个 home 目录,其中包含 folder_1 和 folder_2。您的 .dockerignore
文件设置了以下规则:
* # ignore all files/directories
!folder_1 # do not ignore folder_1
!folder_3 # do not ignore folder_3
不管你本地home目录下有没有folder_1
或folder_3
,它都不会显示任何错误,因为它只是试图找到 .dockerignore
中的特定 files/directories。如果找到 file/directory,它会应用规则。如果它没有找到这个 file/directory,它不会对它做任何事情。
希望现在更清楚了。
您偶尔会看到对 Docker 构建上下文 的引用。构建有两个步骤:
docker build
客户端应用程序为其目录参数创建一个 tar 文件,并在 HTTP 请求中将其发送到 Docker 守护程序。- 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-内部路径的错误消息。