将RUN命令放在一行中可以加快构建速度吗?

时间:2019-05-27 17:01:29

标签: docker

在我的docker文件中,是否将RUN命令放在一行中真的很重要吗?将它们放在一行中会加快构建时间吗?

RUN apt-get update
RUN apt-get -y install --no-install-recommends python3
RUN apt-get -y install --no-install-recommends open-vm-tools

vs。

RUN apt-get update && apt-get -y install --no-install-recommends python3
RUN apt-get -y install --no-install-recommends open-vm-tools

3 个答案:

答案 0 :(得分:4)

通过最小化层数,可以减小图像的大小,是的,还可以节省构建时间。在best practices section "Minimize number of layers"中也建议这样做。

  

在较旧的Docker版本中,重要的是最小化映像中的层数以确保其性能。添加了以下功能来减少此限制。

     
      
  • 只有RUN,COPY,ADD指令创建图层。其他说明会创建临时的中间映像,并且不会增加构建的大小。
  •   
     

...

答案 1 :(得分:2)

实际上,只有一个RUN命令与多个RUN命令的构建和运行时成本是不可察觉的,而且我不会仅出于性能的目的在此进行优化。

在您显示的特定示例中,有两件事是正确的:

  • Debian APT工具本身的启动时间很短;并与一个RUN命令与多个命令分开,一个apt-get install与两个命令将更快。

    RUN apt-get install -y --no-install-recommends python3 open-vm-tools
    
  • Debian和Ubuntu相当频繁地更新其存储库,并且当它们这样做时,上周apt-get update中的软件包链接将停止工作。同时,Docker层缓存将尝试避免重新运行已经运行的步骤。如果您一周前确实构建了映像,则Docker会说“我已经做过RUN apt-get update,因此不需要再次运行它”;但这意味着它缓存了一个过时的包索引。 在同一运行步骤中运行apt-get updateapt-get install很重要。

    RUN apt-get update \
     && apt-get install -y --no-install-recommends python3 open-vm-tools
    

一般来说:

  • 如果要运行某些清理步骤,则必须在同一RUN步骤中运行它们。此序列在构建步骤之后创建了一个图层,因此RUN rm步骤实际上并未使最后一层变小。

    # All of this example should be combined into a single RUN step
    RUN tar xzf package-1.2.3.tar.gz
    RUN cd package-1.2.3 && ./configure && make && make install
    # There is a layer here including the build tree
    RUN rm -rf package-1.2.3
    
  • 如果要在Dockerfile上进行迭代,则在调试时将其分解为许多小的RUN命令会变得更加容易,并在以后进行合并。很好,最后您应该得到一棵相同的树。

    # I'm trying to figure out the configure options so I might
    RUN tar xzf package-1.2.3.tar.gz
    RUN cd package-1.2.3 && ./configure --some-option
    RUN cd package-1.2.3 && make
    

答案 2 :(得分:1)

如果您不清理“一个内衬”末尾的apt缓存,则实际上并不能取得很大的成就。大图层仍会添加到您的图像中。

主要思想是将所有安装放在一行上并以清理结束该行,以便当docker保存该层(继续执行下一个命令之前)时,它仅保存新安装的软件,而不进行所有下载以及不再使用的缓存。

关于速度,您可能会在1行上写更多的东西而有所收获,但是我认为那不是很多。当然,如果您有数百个,那么您会发现有所不同。