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

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

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

真的是.dockerignore应该是.gitignore的超集吗? 如果是这样,您是否实际使用一些工具来加强这种关系?

最佳答案

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

mvn build
docker build -t myapp .

FROM tomcat:9
COPY target/myapp.war /usr/local/tomcat/apps

在此设置中,target目录将位于.gitignore中(您不希望将构建 Artifact 提交给源代码控制),但不会位于.dockerignore中(该镜像必须对镜像可用)。

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

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

    关于git - .dockerignore通常应该是.gitignore的超集吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58707272/

    10-15 20:10