Dockerfile 要求在保证功能的前提下,尽量减少层数。可以通过合并 apt install
来达到减少层的目的。
原本的样子:
RUN apt update \
&& apt install -y --no-install-recommends --allow-unauthenticated \
lxde-core lxde gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine
&& apt autoclean -y \
&& apt autoremove -y \
&& rm -rf /var/lib/apt/lists/*
# ---
RUN apt update \
&& install -y --no-install-recommends --allow-unauthenticated \
software-properties-common curl apache2-utils \
supervisor nginx sudo net-tools zenity xz-utils \
dbus-x11 x11-utils alsa-utils \
mesa-utils libgl1-mesa-dri \
&& apt autoclean -y \
&& apt autoremove -y \
&& rm -rf /var/lib/apt/lists/*
两个 RUN 很相似,先更新,再安装,最后删。
这样 build 的镜像会有两层,不符合最小层的原则,还有就是两次 RUN 都执行了 apt update
这样会更新两次软件源,延长了 build 的时间。总之就是效率很低,而且产物还不理想。
修改后的样子:
RUN apt update \
&& apt install -y --no-install-recommends --allow-unauthenticated \
lxde-core lxde gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine\
# ---
software-properties-common curl apache2-utils \
supervisor nginx sudo net-tools zenity xz-utils \
dbus-x11 x11-utils alsa-utils \
mesa-utils libgl1-mesa-dri \
&& apt autoclean -y \
&& apt autoremove -y \
&& rm -rf /var/lib/apt/lists/*
这样安装相同的 packages 只需要更新一次软件源,而且构建的镜像只有一层。
几个命令解释:
-
-y
:同意安装,build docker 是非交互的过程,所以要使用-y
默认同意安装。 -
--no-install-recommends
:不安装推荐的软件。非必要的文件不安装,减少镜像的体积。 -
--allow-unauthenticated
: 允许安装不可信的 package。 -
apt autoclean
命令清除遗留在/var/cache/apt/archives/
目录下的文件。 -
apt autoremove
移除未使用的软件包。 -
rm -rf /var/lib/apt/lists/*
:/var/lib/apt/lists/
目录下存放的都是软件源的 metadata,也就是用apt update
时下载的文件。不能乱删,第一个 RUN 到后面把这个目录下文件给删了,第二个 RUN 就必须重新apt update
,不然的话,第二个 RUN 中的apt install
很可能就会报错E: Unable to locate package xxx
,原因是找不到软件源。
PS:开发还是应该要有点运维功底的。