使用Dockerfile构建完镜像后,发现镜像特别大:
[cherry@k8s-yasuo:~]$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
php-fpm 7.4.0-alpine-ext d9c182c6c1ae 18 minutes ago 447MB
这是一个基于alpine构建的php-fpm镜像,构建前镜像大小是90M,被我魔改后竟然达到了450M,简直不可思议。不觉明厉之下,决定研究一下为什么镜像达到了这么大。
使用docker history image
可以查看镜像的每一层的构建大小:
最上面的三条就是我新增的三个RUN
指令生成出来的层,可以看到,2b5947710812
这个层是占用了350M,因此可以断定这个指令执行有问题。这个指令执行的是更新alpine的源然后安装上一些php的库:
RUN set -eux; \
echo "https://mirrors.tencent.com/alpine/v3.14/community/" >>/etc/apk/repositories; \
apk add --no-cache ghostscript imagemagick; \
apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \
freetype-dev imagemagick-dev libjpeg-turbo-dev libpng-dev libzip-dev;
本来我期望是在这个RUN执行完成之后再执行一条apk del的命令来删除新增的库:
RUN apk del --no-network .build-deps
但是我忽略了一个问题,docker构建镜像时,每个RUN指令都会生成一个层,后面的指令生成的层是基于上个层来的。也就是说,即使第二个RUN指令删除上个RUN指令添加的文件,此时依旧还是包含了上一个层生成的数据。
解决办法:把两个RUN指令合成为一个。
此处评论已关闭