.dockerignore文件
在docker CLI发送上下文给docker daemon之前,他会在上下文的根目录寻找一个名为.dockerignore的文件。
如果存在这个文件,CLI会在上下文中排除那些匹配pattern的文件和目录。这样避免了我们发送大的不必要的文件到docker daemon,并且可能被ADD和COPY使用。
CLI将.dockerignore文件解析成一个换行pattern列表,类似于globs of Unix shells。为了匹配,上下文的根目录被当做工作目录和根目录。例如/foo/bar和foo/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。但是不能被ADD和COPY放到image当中。
最后,你可能会想实现指定一些文件到上下文当中,一些排除在上下文之外,请使用*作为第一个pattern后面跟随一个!patterns。
注意:因为历史愿意,.是无效的。