我应该使用Dockerfiles还是图像提交?

我对这两个选项有点困惑。 他们似乎是相关的。 但是,它们并不真正兼容。

例如,使用Dockerfiles似乎意味着你不应该对图像进行提交,因为你应该只是在git中跟踪Dockerfile并对其进行更改。 那么什么是权威性就没有歧义。

但是,图像提交看起来非常好。 这太好了,你可以直接修改一个容器,并标记更改以创build另一个图像。 我知道你甚至可以从图像提交历史logging中得到类似文件系统差异的东西。 真棒。 但是,那么你不应该使用Dockerfiles。 否则,如果你做了一个图像提交,你将不得不返回到你的Dockerfile并作出一些改变,代表你做了什么。

所以我被撕裂了 我喜欢图像提交的想法:您不必在Dockerfile中表示图像状态 – 您可以直接跟踪它。 但是我放弃了某种清单文件的概念,这个清单文件让您快速了解图像中的内容。 看到同一个软件包中的两个function似乎不兼容也是令人不安的。

有没有人有这个想法? 使用图像提交被认为是不好的做法? 或者我应该放下我的附件,从我的Puppet日子里清单文件? 我该怎么办?

更新

对于所有认为这是一个基于意见的问题的人,我不太确定。 有一些主观的品质,但我认为这主要是一个客观的问题。 此外,我相信在这个话题上的一个很好的讨论将是信息。

最后,我希望任何读这篇文章的人都能更好地理解Docker文件和图像提交是如何相互关联的。

更新 – 2017/7/18

我刚刚发现了一个合法的使用图像提交。 我们只是在我们公司build立一个CIpipe道,在pipe道的一个阶段,我们的应用testing是在一个容器内运行的。 我们需要在testing运行器进程生成它们(在容器的文件系统中)并且容器已经停止运行之后,从退出的容器中检索覆盖率结果。 我们使用图像提交来做到这一点,提交停止的容器来创build一个新的图像,然后运行显示和转储覆盖文件到标准输出的命令。 所以有这个方便。 除了这个特定的情况,我们使用Dockerfiles来定义我们的环境。

Dockerfiles是一个用来创build图像的工具。

运行docker build .的结果docker build . 是一个提交的图像,所以不可能在创build提交时使用Dockerfile 。 问题是,每当有什么变化,你应该手动更新图像,从而使自己受到黄金形象的诅咒

金色的形象的诅咒是一个可怕的诅咒投给那些必须继续生活在一个错误的安全漏洞基础图像运行他们的软件的人,因为创造它的人很久以前被古代吞噬(或移动到一个新的工作),没有人知道他们在哪里得到了imagemagic版本进入该图像。 而且是唯一的一件事,那就是三年前老板的儿子聘请的那位顾问提供的c ++模块,而且无论如何也没关系,因为即使你弄清楚imagemagic是从哪个版本的libstdc ++ JNI在支持工具中调用长头发的实体只存在于不受支持的ubuntu版本中。

了解这两种解决scheme的优点和不便,是一个好的开始。 因为两者的结合可能是一种有效的方式。

Con:避免金色的图像死胡同:

如果您忘记了如何重build图像,只使用提交是不好的。 您不想处于无法重build图像的状态 。 这最后的状态在这里被称为金色的形象,因为图像将是你唯一的参考,每个阶段的起点和终点。 如果你松了,你会很麻烦,因为你不能重build它。 致命的死胡同是有一天你需要重build一个新的系统(因为所有的系统库已经过时了),你不知道要安装什么,最终会导致大量的时间浪费。

作为一个方面说明 ,如果历史日志可以很容易地使用(参考差异,并在其他图像上重复),那么很可能使用提交提交更好,因为它在git中:你会注意到git没有这个困境。

临:光滑的升级分发

另一方面,分层提交在分布式升级,带宽和部署时间方面具有相当大的优势。 如果你开始处理docker镜像,就像一个面包师正在处理pancakes(这正是docker允许的),或者想立即部署testing版本一样,你会更乐意发送一个小的更新,而不是一个小的commit全新的形象。 特别是当您的客户持续集成应该尽快部署错误修复程序时。

尝试获得两个最好的世界:

在这种情况下,您可能需要标记主要版本的图像,它们应该来自Dockerfiles 。 而且您可以提供持续集成版本,这要归功于基于标签版本的提交。 这减轻了Dockerfiles和分层提交scheme的优点和不方便。 在这里,关键的一点是,你永远不会停止跟踪你的图片,通过限制你允许做的提交数量。

所以我想这取决于你的情况,你可能不应该试图find一个单一的规则。 但是,无论解决scheme是什么,都可能存在一些真正应该避免的死angular(最终会出现“黄金图像”情景)。