使用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指令合成为一个。

最后修改:2021 年 08 月 15 日
如果觉得我的文章对你有用,请随意赞赏