squash参数,有效减小Docker镜像大小
在使用Dockerfile
生成镜像时,可能会由于编写不规范等原因造成镜像过大,虽然有很多工具可以缩小镜像的大小,但大部分都是需要安装额外的工具,我在构造镜像的过程中,发现了一个有意思的参数,即docker
的squash
参数,以此文章来记录。
在不使用该参数的情况下,我们来构造这样的一个镜像,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
实际上输出的web:v1镜像为618M!
为什么会这么大?因为COPY
指令形成了一层进行,在RUN指令中对a.config
文件进行了修改,此时则会创建一个新的层,并将修改后的文件添加到新层中。这就导致了镜像文件很大,至少包含了nginx+a.config+a.config
的大小。
也可以从镜像的history查看到:
docker --squash
使用方法极其简单,在构建镜像的时候只需要加上--squash
即可,但这个参数仅在实验模式下才能使用,这个实验模式说白一点就是类似手机的开发模式,squash
参数在docker v1.13.0
就已经被引入。
如果没有开启实验模式,会有如下提示:
开启实验模式,修改/etc/docker/daemon.json
文件,增加以下行
{
"experimental": true
}
重启docker服务:
systemctl daemon-reload
systemctl restart docker
构建镜像:
此时镜像的大小只有380M!
那squash
参数到底做了什么呢?我们可以通过history
来观察,可以看到最上面一层是merge
层,Dockerfile
中引入的文件,最终都在这一层中,即对文件的所有操作都在merge
层,这有效地减少了镜像的大小!
当然,使用该参数也有以下限制:
Dockerfile
仅包含ENV
指令时,会压缩失败- 提取单个层需要更长的时间,并且无法并行下载单个层。
– 完