Dockerignore:忽略文件和Dockerfile之外的所有内容


89

因此,主要目的是将胖子罐应用程序码头化并放入Elasticbeanstalk中。问题在于上下文。如果实际上我只需要一个jar文件,那么将大量上下文添加到Docker中有点愚蠢。

我一直在玩.dockerignore文件,但是迷路了。我试图使用gitignore否定,但它不起作用。

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

正则表达式中也存在该问题,但似乎不支持复杂的正则表达式。

^((?!Dockerfile).)*$

我也尝试过在stackoverflow中搜索,而这两个都是我发现的:

这个问题可能与第二个问题类似,但是我认为这略有不同,因为在这里,我只想在上下文中包含一个文件。

任何帮助将不胜感激。


文件夹的感叹号对我有用!
伊万·阿拉基

Answers:


127

如果您需要忽略除某些目录或文件以外的所有内容,并且还忽略那些允许的目录中的一些不必要的文件,则可以使用以下.dockerignore文件:

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db

8
根据Docker文档,仅*放在第一行(而不是**)就足够了。引用:“您可能希望指定要包含在上下文中的文件,而不是要排除的文件。要实现此目的,请指定*为第一个模式,然后指定一个或多个!异常模式。
约翰尼·雷德曼

31

dockerfile参考中

除了Go的filepath.Match规则外,Docker还支持特殊的通配符字符串**,该字符串可以匹配任意数量的目录(包括零个)。例如,** / *。go将排除所有目录(包括构建上下文的根目录)中所有以.go结尾的文件。

因此,仅包含**的行将忽略与Dockerfile相同目录中的所有内容。

如预期的那样,惊叹号可用于引用您希望发送给docker守护程序的任何文件。


3
**转到文件的顶部非常重要,否则排除项将被忽略。Docker使用匹配的最后一条规则作为“最终”规则,因此如果**最后匹配,它将匹配所有内容。
tedivm

3
因此**!foo如果这foo是您要包括的唯一文件,请在第一行和下一行添加。
萨卡

9

这听起来可能很奇怪,但是如果您只需要一个jar文件,则可以在构建系统中创建一个包含Dockerfile的“ docker”文件夹。运行构建时,让构建脚本将单个jar文件复制到“ docker”中,然后执行docker image构建(从“ docker”文件夹内部)并在完成后推送到docker注册表。


2
嗨,这听起来一点也不奇怪。我以为这是一种常规做法,但是我正在寻找一种方法来尽可能地使用.dockerignore。此外,我不太喜欢mvn xml :)
Rowanto

您可以通过将dockerfile放在子目录中并使用.dockerignore来结合使用这两种方法。根据文档,无论如何都这样做是很好的
Jonathan Lee

Docker的文档:在大多数情况下,最好以空目录作为上下文,并将Dockerfile保留在该目录中。仅添加构建Dockerfile所需的文件。警告:请勿将您的根目录/用作PATH,因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护程序。
李宗盛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.