Dockerfile参考(5) – .dockerignore文件

在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解析前忽略。
例如:

  1. # comment
  2.     */temp*
  3.     */*/temp*
  4.     temp?

行为解释如下:

  • # comment:忽略
  • */*/temp*:排除从根目录两级目录的子目录下以temp开始的文件或目录。例如,/somedir/subdir/temporary.txt文件会被排除。
  • temp?:排除temp后加一个字符的文件或目录。如/tempa和/tempb被排除。
  • 使用Go的filepath.Match规则完成匹配。除了Go的filepath.Match规则,docker也支持一个特殊的通配符**,用来匹配任意数量的目录。如**/*.go将排除在所有目录中以.go后缀的文件,包括根目录。
    以!开始的行表示与排除相反的动作,即包括。如下:

    1. *.md
    2.     !README.md

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

    1. *.md
    2.     !README*.md
    3.     README-secret.md

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

    1. *.md
    2.     README-secret.md
    3.     !README*.md

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

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

    标签:Docker 发布于:2019-11-19 23:13:21