先说结论:
有些时候能,有些时候不能,但你要明白原理 – Docker 使用 UnionFS,镜像尺寸随着层数增多,是单调非减的。
问题
看到一个 Dockerfile:
FROM python:3.17.7-alpine3.20
RUN pip3 install pillow
RUN pip3 install django
RUN pip3 install jieba
RUN pip3 install nltk
RUN pip3 install colormap
有人建议,把这几个 pip3 install 合并成一个 pip3 install -r requirements.txt,可以减小最终打包出来的镜像尺寸,真得是这样吗?
实验一:一次 pip 安装 vs 多次 pip 安装
多次 pip 安装
我们把上面这个最初始的 Dockerfile 打包出来的镜像起名为 temp:multi。
通过 docker image ls temp:multi
看到,这个包的大小为 396MB
然后,通过 docker history temp:multi
看到这个包的层级如下:
IMAGE CREATED CREATED BY SIZE COMMENT
a934e19243c7 2 hours ago RUN /bin/sh -c pip3 install colormap -i ht… 177MB buildkit.dockerfile.v0
<missing> 2 hours ago RUN /bin/sh -c pip3 install nltk -i ht… 22.8MB buildkit.dockerfile.v0
<missing> 2 hours ago RUN /bin/sh -c pip3 install django -i ht… 39.1MB buildkit.dockerfile.v0
<missing> 2 hours ago RUN /bin/sh -c pip3 install jieba -i ht… 83.5MB buildkit.dockerfile.v0
<missing> 2 hours ago RUN /bin/sh -c pip3 install pillow -i ht… 27.1MB buildkit.dockerfile.v0
<missing> 2 weeks ago CMD ["python3"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago RUN /bin/sh -c set -eux; for src in id