在Dockerfile中不使用多个RUN命令的原因是什么?

时间:2016-06-15 13:41:49

标签: performance docker dockerfile

我已经看过几个Dockerfile,我觉得人们试图避免使用RUN命令。但为什么呢?

所以有什么东西(在这个例子中是重复的文字)更喜欢

RUN gem install \
  jekyll \
  github-pages

RUN gem install jekyll
RUN gem install github-pages

1 个答案:

答案 0 :(得分:5)

每次执行RUN命令都会从最后生成的图像创建一个临时容器,执行命令并将结果保存为新图层。最小化RUN命令既减少了这些中间容器的开销量,又可以显着缩小生成的图像的大小。

例如,如果您执行2个运行命令,一个下载1 gig数据,另一个删除该数据,则生成的图像将超过一个gig,即使它在一个gig中不可见运行容器。

因此,在进行大量下载缓存文件以进行安装或构建应用程序并在完成时清理该构建环境时,这样做是一个很好的做法,因此删除的文件永远不会它进入图像的任何部分。

最后一个原因是缓存。如果您需要从软件包存储库中提取新版本的应用程序,您还需要在安装之前更新该远程存储库(例如apt-get update)上的信息以获取最新版本。如果将apt-get updateapt-get install分开,则可以从旧版本缓存更新命令,安装将尝试提取旧文件或不存在的文件。