我从2017年做Vulhub开始,一直在和一个麻烦的问题做斗争:在编写Dockerfile的时候,如何减小docker build
生成的镜像大小?这篇文章就给大家总结一下我自己使用过的六种减小镜像大小的方法。
1. 使用Alpine Linux
Alpine Linux是一个基于BusyBox和Musl Libc的Linux发行版,其最大的优势就是小。一个纯的基础Alpine Docker镜像在压缩后仅有2.67MB。
不少Docker官方镜像都有Alpine版本,比如PHP:
比较之下就可以发现,alpine版本镜像大小是普通版本的1/5左右。
但是在Docker Hub中,大部分镜像是没有Alpine版本的,比如Mysql和PHP-Apache,如果我们需要基于这些环境开发,就不得不自己编写Alpine版本,或者找一些第三方镜像。
另外,Alpine的另一个缺点是,其使用了Musl Libc作为传统的glibc的替代,编译软件的时候可能会遇到一些不可预知的问题,这一点会导致我们耗费不少不必要的时间。
2. 只安装最少的依赖
apt-get、yum、apk等软件包管理器是我们编译镜像时必然需要用到的工具,纯净的Docker基础镜像通常会缺少wget、curl、git、gcc等工具,需要我们手工来安装。
我们以apt为例,apt-get在安装软件的时候,可以指定一个选项:--no-install-recommends
,指定这个参数后,有一些非必须的依赖将不会被一起安装。比如,我们安装wget时,如果增加这个选项,待安装的包将从6个减少为3个:
这在一定程度上缩小了镜像的大小,但这样做带来的副作用就是,可能导致目标软件缺少一些功能。
比如,此时的wget将无法验证服务器证书的真伪,导致命令出错: