在我的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
答案 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 update
和apt-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行上写更多的东西而有所收获,但是我认为那不是很多。当然,如果您有数百个,那么您会发现有所不同。