.dockerignore文件

在docker CLI发送上下文给docker daemon之前,他会在上下文的根目录寻找一个名为.dockerignore的文件。

如果存在这个文件,CLI会在上下文中排除那些匹配pattern的文件和目录。这样避免了我们发送大的不必要的文件到docker daemon,并且可能被ADDCOPY使用。

CLI将.dockerignore文件解析成一个换行pattern列表,类似于globs of Unix shells。为了匹配,上下文的根目录被当做工作目录和根目录。例如/foo/barfoo/bar同样排除一个的叫做bar的文件或者目录,bar可能位于PATH的foo子目录或者URL中的git仓库的foo目录。

如果.dockerignore文件的一行的第一列是以#开头,那么这一行会被当做注释,不会被CLI所解析。

下面是一个.dockerignore文件的例子:

# comment
    */temp*
    */*/temp*
    temp?
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结尾的目录和文件。

!开头的行将被作为例外处理,下面的例子用到了这个机制:

    *.md
    !README.md

除了README.md之外的所有markdown文件都会从上下文中排除。

使用!后的特殊行为:匹配特定文件的.dockerignore的最后一行决定是否包含还是排除(就近原则)。请考虑下面的例子:

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

除了以README开头的md文件都会被排除,但是README-secret.md也会被排除。

现在考虑下面这个例子

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

所有的README文件都将被包含在上下文当中,因为最后一行指令中间那一行没有生效。

你甚至可以使用.dockerignore文件排除Dockerfile.dockerignore文件。这些文件同样会发送到docker daemon。但是不能被ADDCOPY放到image当中。

最后,你可能会想实现指定一些文件到上下文当中,一些排除在上下文之外,请使用*作为第一个pattern后面跟随一个!patterns。

注意:因为历史愿意,.是无效的。

results matching ""

    No results matching ""