.dockerignore file

Docker CLI将上下文发送到Docker守护进程之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免将较大或敏感的文件和目录发送到守护进程,并避免使用ADDCOPY将它们添加到镜像中。

CLI.dockerignore文件解释为以换行符分隔的与Unix shell的文件通配符类似的模式列表。为了匹配,上下文的根被认为是工作目录和根目录。例如,模式/foo/barfoo/bar都在PATHfoo子目录中或位于URLgit存储库的根目录中排除名为bar的文件或目录。两者都不排除其他任何东西。

如果.dockerignore文件中的行以#开头,则该行被视为注释,并且在CLI解释.dockerignore之前将被忽略。

.dockerfileignore文件示例:

# comment
*/temp*
*/*/temp*
temp?

.dockerignore会产生以下的构建行为:

Rule

Behavior

#comment

注释被忽视

*/temp*

在根目录的当前子目录中排除名称以temp开头的文件和目录。例如,排除了纯文本文件/somedir/temporary.txt,以及目录/somedir/temp

*/*/temp*

在根目录的二级子目录中排除名称以temp开头的文件和目录。 例如 /somedir/subdir/temporary.txt

temp?

排除根目录中名称为temp的一个字符扩展的文件和目录。例如,排除/tempa/tempb

匹配是通过Gofilepath.Match规则完成的。预处理步骤删除了头部和尾部的空格,并使用Gofilepath.Clean消除了.和..元素。预处理后,空白的行将被忽略。

除了Gofilepath.Match规则之外,Docker还支持特殊的通配符字符串*该字符串可以匹配任意数量的目录(包括零个)例如**/go将排除在所有目录(包括构建上下文的根目录)中找到的以.go结尾的文件。

!开头的行可用于指定不需要排除的文件或目录。以下是使用此机制的示例

.dockerignore文件

*.md
!README.md

当前上下文中的所有markdown文件都不会被排除,除了README.md文件

*.md
!README*.md #不会影响最后一行的模式匹配,因为不是位于文件的最后一行。
README-secret.md # 虽然与上一行的模式匹配,但是位于文件的最后一行,所以依然会被排除。

markdown文件不会包含在当前上下文目录中,除了README文件,README-secret.md也不会包含在上下文目录中

现在考虑以下示例:

*.md
# 空行会被忽略
README-secret.md #出现在!开头的模式的前面,因此!README.md模式依然会对该行起作用,所以README-secret.md文件会被包含在上下文中。

!README*.md #会对上一行的模式匹配起作用,因为位于文件最后一行。

所有的README文件都会被包含在上下文中。中间的行不会起作用,因为!README*.md出现在最后一行。

我们甚至可以使用.dockerignore文件来排除Dockerfile.dockerignore文件。这些文件仍被发送到docker守护进程。因为仍然需要它们来帮助完成构建镜像的任务。但是ADDCOPY指令不会将它们复制到镜像中。

最后,我们可能想要指定需要包含在上下文中的文件,而不是要排除的文件。为此,将*指定为第一个模式,然后指定一个或多个!模式

Note:

因为历史原因,.通配符会被忽略 。

Last updated