Linux入门教程:Dockerfile参考(5) – .dockerignore文件,如果这个文件存在,C


在docker CLi发送上下文到docker daemon之前,它首先先在上下文的根目录查找名为.dockerignore的文件。如果这个文件存在,CLI则更改上下文来排除与这文件里的模式匹配的文件和目录。这帮助避免了发送不必要的大的或敏感的文件和目录到daemon,以及有可能使用ADD或COPY把不必要的文件添加到镜像。
CLI解析.dockerignore为以行为分隔的模式列表,类似于Unix shells的golbs文件。基于匹配的目的,上下文的根目录可以是工作目录或根目录。例如,/foo/bar和foo/bar模式都是排除PATH或URL git仓库根目录的子目录foo下的bar文件。
如果.dockerignore中的一行以#开始,那么这行视为注释,会以CLI解析前忽略。
例如:

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

行为解释如下:

# comment:忽略 <*/temp*:排除在任意根目录的子目录下以temp开始的文件和目录。例如,/somedir/temporary.txt文件和/somedir/temp目录都被排除。 */*/temp*:排除从根目录两级目录的子目录下以temp开始的文件或目录。例如,/somedir/subdir/temporary.txt文件会被排除。 temp?:排除temp后加一个字符的文件或目录。如/tempa和/tempb被排除。

使用Go的filepath.Match规则完成匹配。除了Go的filepath.Match规则,docker也支持一个特殊的通配符**,用来匹配任意数量的目录。如**/*.go将排除在所有目录中以.go后缀的文件,包括根目录。
以!开始的行表示与排除相反的动作,即包括。如下:

*.md     !README.md

除了README.md,其它的.md文件排除。
放置!例外规则影响的行为:.dockerignore的最后行匹配的文件决定是否是包含或排除。如下:

*.md     !README*.md     README-secret.md

除了README markdown文件(不含README-secret.md),其它的markdown文件包括全都排除。
再看一个例子:

*.md     README-secret.md     !README*.md

包括所有的README文件。中间的行没有影响是因为!README*.md匹配了README-secret.md。
你甚至可以使用.dockerignore文件来排除Dockerfile和.dockerignore文件。这些排除的文件仍然会发送到daemon,因为需要它们来工作。不过ADD和COPY命令不再复制它们到镜像。
最后,你可能想指定包括一些文件,而不是排除。那么可以在第一行输入*,随后的行使用!来包括。

注意:由于历史原因,模式.会被忽略。

相关内容