.dockerignore file
在Docker CLI将上下文发送到Docker守护进程之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免将较大或敏感的文件和目录发送到守护进程,并避免使用ADD或COPY将它们添加到镜像中。
CLI将.dockerignore文件解释为以换行符分隔的与Unix shell的文件通配符类似的模式列表。为了匹配,上下文的根被认为是工作目录和根目录。例如,模式/foo/bar和foo/bar都在PATH的foo子目录中或位于URL的git存储库的根目录中排除名为bar的文件或目录。两者都不排除其他任何东西。
如果.dockerignore文件中的行以#开头,则该行被视为注释,并且在CLI解释.dockerignore之前将被忽略。
.dockerfileignore文件示例:
.dockerignore会产生以下的构建行为:
Rule
Behavior
#comment
注释被忽视
*/temp*
在根目录的当前子目录中排除名称以temp开头的文件和目录。例如,排除了纯文本文件/somedir/temporary.txt,以及目录/somedir/temp。
*/*/temp*
在根目录的二级子目录中排除名称以temp开头的文件和目录。 例如 /somedir/subdir/temporary.txt
temp?
排除根目录中名称为temp的一个字符扩展的文件和目录。例如,排除/tempa和/tempb。
匹配是通过Go的filepath.Match规则完成的。预处理步骤删除了头部和尾部的空格,并使用Go的filepath.Clean消除了.和..元素。预处理后,空白的行将被忽略。
除了Go的filepath.Match规则之外,Docker还支持特殊的通配符字符串*,该字符串可以匹配任意数量的目录(包括零个)。例如,**/。go将排除在所有目录(包括构建上下文的根目录)中找到的以.go结尾的文件。
以!开头的行可用于指定不需要排除的文件或目录。以下是使用此机制的示例
.dockerignore文件:
当前上下文中的所有markdown文件都不会被排除,除了README.md文件
markdown文件不会包含在当前上下文目录中,除了README文件,README-secret.md也不会包含在上下文目录中
现在考虑以下示例:
所有的README文件都会被包含在上下文中。中间的行不会起作用,因为!README*.md出现在最后一行。
我们甚至可以使用.dockerignore文件来排除Dockerfile和.dockerignore文件。这些文件仍被发送到docker守护进程。因为仍然需要它们来帮助完成构建镜像的任务。但是ADD和COPY指令不会将它们复制到镜像中。
最后,我们可能想要指定需要包含在上下文中的文件,而不是要排除的文件。为此,将*指定为第一个模式,然后指定一个或多个!模式。
Note:
因为历史原因,.通配符会被忽略 。
Last updated