squash参数,有效减小Docker镜像大小

squash参数,有效减小Docker镜像大小

在使用Dockerfile生成镜像时,可能会由于编写不规范等原因造成镜像过大,虽然有很多工具可以缩小镜像的大小,但大部分都是需要安装额外的工具,我在构造镜像的过程中,发现了一个有意思的参数,即dockersquash参数,以此文章来记录。

在不使用该参数的情况下,我们来构造这样的一个镜像,Dockerfile如下:

[root@txy201-51 dockerfile]# cat dockerfile
 FROM nginx
 MAINTAINER 运维少年
 COPY a.config /etc/
 RUN chmod +x /etc/a.config

这个Dockerfile很简单,即复制一个文件,并将文件的权限进行修改,各位觉得此时进行有多大?

图片

a.config文件大小为228M,Nginx进行大小为141M

img

图片

实际上输出的web:v1镜像为618M!

img

为什么会这么大?因为COPY指令形成了一层进行,在RUN指令中对a.config文件进行了修改,此时则会创建一个新的层,并将修改后的文件添加到新层中。这就导致了镜像文件很大,至少包含了nginx+a.config+a.config的大小。

图片

也可以从镜像的history查看到:

img

docker --squash使用方法极其简单,在构建镜像的时候只需要加上--squash即可,但这个参数仅在实验模式下才能使用,这个实验模式说白一点就是类似手机的开发模式,squash参数在docker v1.13.0就已经被引入。 如果没有开启实验模式,会有如下提示:

图片

开启实验模式,修改/etc/docker/daemon.json文件,增加以下行

{
  "experimental": true
 }

重启docker服务:

systemctl daemon-reload
systemctl restart docker

构建镜像:

img

此时镜像的大小只有380M!

图片

squash参数到底做了什么呢?我们可以通过history来观察,可以看到最上面一层是merge层,Dockerfile中引入的文件,最终都在这一层中,即对文件的所有操作都在merge层,这有效地减少了镜像的大小!

img

当然,使用该参数也有以下限制:

  1. Dockerfile 仅包含ENV指令时,会压缩失败
  2. 提取单个层需要更长的时间,并且无法并行下载单个层。

– 完