Dockerfile和Docker镜像的区别

10

我正在创建一些Docker镜像,用于在开发机器上进行测试。 我计划为我们的主要应用程序构建一个镜像,并为每个外部依赖项(如postgres、elasticsearch等)构建一个镜像。对于主应用程序,我在决定是编写Dockerfile还是编译要托管的镜像方面有困难。

一方面,Dockerfile易于共享和随时间修改。 另一方面,我预计高级配置(自定义应用程序属性文件)将更容易在vim中完成,然后再提交新镜像。

我知道无论哪种方式都可以达到相同的结果,但我正在寻找使用任一方向的优缺点和陷阱。

作为附注,我计划使用Fig将所有内容捆绑在一起。 我对此工具的初步印象非常好。

谢谢!


3
同样的讨论是关于以源代码还是编译后的二进制形式分发应用程序。 - Mark O'Connor
有趣的说法。我之前没有这样想过。 - Jeff Fairley
2个回答

13
使用Dockerfile:
  • 您拥有一个“审计日志”,描述了如何构建镜像。对于我来说,如果它将在生产流水线中使用,在多人协作和可维护性应该是重点的情况下,这是基本的。
  • 您可以自动化构建映像的过程,这是一种更新容器的简单方法,或者如果它必须参与持续交付流水线,则非常重要。
  • 这是创建容器层的更干净的方式(每个Dockerfile命令都是不同的层)。

更改容器并提交更改,非常适合测试目的和快速开发概念测试。但是,如果您计划长时间使用结果图像,我肯定会使用Dockerfiles。

此外,如果您必须修改文件,并且使用bash工具(awk,sed…)非常繁琐,您可以在构建过程中从外部添加任何文件。


我想,最初的想法是可以制作一个 Dockerfile 并将其作为附件发送给任何人,但没有上下文会有些缺陷。不必将 config 文件作为 RUN 命令进行编辑,我开始看到将它们作为卷添加仍然是一种不错的中间方式,而无需完全提交镜像。 - Jeff Fairley

12

我完全同意Javier的观点,但您需要理解使用Dockerfile创建的镜像和在同一版本的Dockerfile中构建的镜像可能会在1天之后存在差异。

也许在您的构建过程中,自动检索应用程序或操作系统等的最新更新…

如果此时您需要重现崩溃或其他问题,则不能依赖Dockerfile。


这对我帮助很大。我简直不敢相信我以前没有想到过这个! - Baub
5
Dockerfile需要完全指定其所调用和包含的内容的版本,否则会出现本文所描述的无法重现的行为。如果Dockerfile(或Makefile或任何构建工具)对于不同的运行产生了不同的结果,则它是错误的。如果构建工具从某种仓库中拉取内容,而该仓库不能确保您每次都获取相同的内容,则该仓库的设计有误。 - stevegt

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