我应该在Docker镜像内编译我的应用程序吗?

16

虽然我大部分时间都在开发Java应用程序,而且只使用Maven,所以我的构建应该是可再现的(至少这就是Maven所说的)。

但是假设你正在编译C++程序或其他更复杂的东西,你是否应该在Docker中构建?
或者最好使用Vagrant或另一种技术来产生可再现的构建。

如何通过Docker管理可再现构建?

2个回答

8
你可以这样做,但不要在最终图像中这样做,因为这将导致比必要的更大的图像:它将包含所有编译工具,而不是仅限于你需要执行生成的二进制文件所需的内容。
你可以在"如何为Ruby项目构建一个没有构建工具的Docker镜像?"中看到一个替代方案。
  • 我使用一个镜像来构建,
  • 我将停止运行的容器作为新镜像提交(包括结果二进制文件的卷),
  • 我使用一个执行镜像(只包含运行所需的内容),并从另一个镜像中复制二进制文件。然后我再次提交生成的容器。
最终图像包括已编译的二进制文件和执行环境。

哈,是的,我听说过你应该尽可能保持图像尺寸小。 - Derrops
@Snickers3192 是的,我提到的链接包含一个完整的示例。 - VonC
我稍微编辑了一下,因为有一个关闭投票,我认为问题的措辞不太理想,但所有这些云计算的东西都让我感到困惑。 - Derrops
@Snickers3192 我进行了一些编辑,因为在 Stack Overflow 上,“利弊”问题是不被赞同的。 - VonC

1
我也想回答这个问题,进一步说明VonC的答案。实际上,我刚刚接受了Redhat Openshift培训,他们使用了一个名为Source to Image s2i的工具,该工具使用docker创建docker映像。而且,这种策略非常适用于管理私有(或公共)云,其中您的构建可能在不同的机器上编译,但需要保持构建环境的一致性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接