.dockerignore通常应该是.gitignore的超集吗?

时间:2019-11-05 08:30:35

标签: git docker

让我们关注在项目中同时使用Docker和Git的场景。在这种情况下,同时维护.gitignore.dockerignore文件都是很方便的。

我试图了解两个文件之间的关系。我的初学者怀疑.dockerignore应该是.gitignore的超集,并且始终至少包含相同的项目。

我的理由是,如果.dockerignore未列出.gitignored的某个文件,那么我们在开发人员机器上的构建上下文将包含该文件,而在持续集成环境中的构建上下文将获得成功。 't(因为它仅适用于git存储库中存在的文件)。这很容易导致本地构建的docker映像正常工作,但由于在构建服务器上使用同一代码构建的映像使用了不同的输入数据,因此该映像被破坏了。

是真的,.dockerignore通常应该是.gitignore的超集吗?如果是,您是否真的使用某种工具来实现这种关系?

2 个答案:

答案 0 :(得分:1)

在Docker外部构建应用程序并注入生成的二进制文件是相当普遍的。我在SO上看到的最常见的示例是基于Java的应用程序。 Java类文件格式被设计为可跨环境移植,因此,无论是否在开发人员的工作站上构建.jar文件,差异都不会太大。您可以运行

mvn build
docker build -t myapp .
FROM tomcat:9
COPY target/myapp.war /usr/local/tomcat/apps

在此设置中,target目录位于.gitignore中(您不希望将构建工件提交给源代码控制),但它不在.dockerignore中(需要可用)图片)。

可能有用的其他一些模式包括:

  • 在开发时间较长的开发人员环境中使用编译语言,因此您无需花费几分钟就可以在多阶段构建中等待make的情况下获得测试图像
  • 当图像需要包含托管在源代码控制之外的某个地方的静态资产时,例如Amazon S3
  • 如果在构建时生成了一些数据集,那么这些数据集足够大以至于不希望被检入,但又足够小以至于无法将它们添加到图像中(也许是5-500 MB)

(我通常忽略.dockerignore,但我也尝试明确说明我将COPY放入图像中的文件。)

答案 1 :(得分:1)

我不认为.dockerignore.gitignore的超集。 Docker会忽略您希望Docker构建忽略的contans文件,在某些情况下,它也可能是您的源代码。以您正在使用maven构建的Java项目为例。

在这种情况下,构建Docker容器时,您可能只对target文件夹感兴趣,而对其他任何文件夹都不感兴趣。而.gitignore将具有目标文件夹,因为您无需将已编译的二进制文件(jar / war)检入源存储库。

类似地,在构建期间可能还会生成/下载其他文件,这些文件在容器中是必需的,而在源存储库中是不需要的。因此,简而言之,我认为强制执行superset规则不是一个好主意,至少不要以通用的方式包含在内。