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

我已经看到了几个Dockerfile,我有这样的感觉,人们试图避免使用RUN命令。 但为什么?

那么有没有什么(但在这个例子中重复的文字)更喜欢

 RUN gem install \ jekyll \ github-pages 

过度

 RUN gem install jekyll RUN gem install github-pages 

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

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

因此,当大量下载caching文件来安装或构build应用程序,并在完成后清理构build环境时,最好将其作为一个单独的步骤来执行,因此删除的文件永远不会成为图片。

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