让我们关注在项目中同时使用Docker和Git的场景。在这种情况下,同时维护.gitignore
和.dockerignore
文件都是很方便的。
我试图了解两个文件之间的关系。我的初学者怀疑.dockerignore
应该是.gitignore
的超集,并且始终至少包含相同的项目。
我的理由是,如果.dockerignore
未列出.gitignored
的某个文件,那么我们在开发人员机器上的构建上下文将包含该文件,而在持续集成环境中的构建上下文将获得成功。 't(因为它仅适用于git存储库中存在的文件)。这很容易导致本地构建的docker映像正常工作,但由于在构建服务器上使用同一代码构建的映像使用了不同的输入数据,因此该映像被破坏了。
是真的,.dockerignore
通常应该是.gitignore
的超集吗?如果是,您是否真的使用某种工具来实现这种关系?
答案 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
的情况下获得测试图像(我通常忽略.dockerignore
,但我也尝试明确说明我将COPY
放入图像中的文件。)
答案 1 :(得分:1)
我不认为.dockerignore
是.gitignore
的超集。 Docker会忽略您希望Docker构建忽略的contans文件,在某些情况下,它也可能是您的源代码。以您正在使用maven
构建的Java项目为例。
在这种情况下,构建Docker容器时,您可能只对target
文件夹感兴趣,而对其他任何文件夹都不感兴趣。而.gitignore将具有目标文件夹,因为您无需将已编译的二进制文件(jar / war)检入源存储库。
类似地,在构建期间可能还会生成/下载其他文件,这些文件在容器中是必需的,而在源存储库中是不需要的。因此,简而言之,我认为强制执行superset
规则不是一个好主意,至少不要以通用的方式包含在内。