# 减小Docker镜像空间的方法 ## 方法一、使用Alpine Linux Alpine Linux是一个基于BusyBox和Musl Libc的Linux发行版,其最大的优势就是小。一个纯的基础Alpine Docker镜像在压缩后仅有2.67MB。 ## 方法二、只安装最少的依赖 apt-get、yum、apk等软件包管理器是我们编译镜像时必然需要用到的工具,纯净的Docker基础镜像通常会缺少wget、curl、git、gcc等工具,需要我们手工来安装。我们以apt为例,apt-get在安装软件的时候,可以指定一个选项:`--no-install-recommends`,指定这个参数后,有一些非必须的依赖将不会被一起安装。比如,我们安装wget时,如果增加这个选项,待安装的包将从6个减少为3个。 ## 方法三、用apt卸载没用的 某些工具只有编译阶段使用,我不希望它们占用我宝贵的镜像容量,就可以在镜像编译完成后,将这些中间依赖删掉。 我们以apt为例,在使用完成后,我们需要做的事情有: 删除那些不需要的依赖:apt-get pruge --autoremove ... 删除本地的软件包列表:rm -rf /var/lib/apt/lists/* ## 方法四、尽量将中间依赖的安装与删除操作放在一个步骤中 docker镜像是一个由“层”来堆叠起来的“千层饼”,我们可以使用`docker history `这条命令来查看任意一个镜像是由哪些层组成的,以及每一层的大小。对于Dockerfile来说,这些层的数据都将会被保存在镜像中,即使后一层删除了前一层内保存的文件。 ```dockerfile FROM alpine:3.12 RUN truncate -s 50M /sample.dat RUN rm -rf /sample.dat ``` 相比起来,正常的alpine:3.12只有5.57MB,说明即使我们已经删除了`/sample.dat`文件,在最后的镜像中也没有这个内容,但是它永远留在了镜像的history中。 ```dockerfile FROM debian:buster RUN apt-get update \ && apt-get install gcc \ && gcc ...\ && apt-get purge --autoremove gcc \ && rm -rf /var/lib/apt/lists/* ``` ## 方法五、多阶段编译 在Docker 17.05版本以后,新引入了**multi-stage builds**这一概念,这将会极大地简化我们上述的所有操作。简单来说,multi-stage builds支持我们将Docker镜像的编译分成多个“阶段”。比如常见的软件编译的情况,我们可以将编译阶段单独提出来,软件编译完成后直接将二进制文件拷贝到一个新的基础镜像中,这样做最大的好处就是,第二个镜像不再包含任何编译阶段使用的中间依赖,干干净净明明白白。 ## 方法六、使用slim版本的镜像 slim的中文意思就是“苗条的”,顾名思义,`debian:stretch-slim`确实苗条的多,原因是其删除了man文档等许多不会在容器里用到的文件。