.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。
注意:因为历史愿意,.
是无效的。