Dockerfile中的多个RUN条目之间有什么区别?
FROM php:5.6-apache
RUN docker-php-ext-install mysqli
RUN apt update
RUN apt install git -y -q
只有一个RUN条目吗?
FROM php:5.6-apache
RUN docker-php-ext-install mysqli && apt update && apt install git -y -q
OBS。我不是问哪个更好。我想知道这两种方法之间的所有差异。
答案 0 :(得分:5)
每个RUN
命令都会创建一个文件系统更改层,该文件系统更改由开始运行该命令的临时容器生成。 (它实际上是在运行docker run
,然后将docker diff
的结果打包到文件系统层中。)
这些层有一些关键细节要注意:
两种方法之间的主要区别是构建缓存和删除文件。如果将源代码tgz的下载,tgz的提取,编译二进制文件以及tgz和源文件夹的删除分成多个RUN
行,则在通过网络发送映像时,将其存储在磁盘上,即使在最终容器中看不到它,您也将在图层中拥有所有源。您的图片会大很多。
当您缓存太多时,缓存也可能是一件坏事。如果您将apt update
和apt install
分开,然后在几个月后添加新软件包以安装到第二个运行行,则docker将重用几个月前的apt update
缓存并尝试安装软件包已有数月的历史,可能不再可用,并且您的映像可能无法构建。许多人在安装debian软件包后也运行rm -rf /var/lib/apt/lists/*
。而且,如果您在单独的步骤中执行此操作,则实际上不会删除先前图层中的文件,因此图像不会缩小。