我们有个服务,镜像体积滚到了 1.2G。部署一次十分钟起步,机房拉镜像经常超时。六月花了两天处理,最后落到 180M。
1、换基础镜像
原来用的是带完整 JDK 的底包,光底子就八百多兆。换成 alpine 加 JRE 之后,底子掉到一百兆以内。这一招效果最明显,也最省事。
2、调整分层顺序
Dockerfile 里指令的顺序直接影响缓存命中。原来是把整个项目 COPY 进去再打包,代码改一行就要重跑依赖下载。改成先 COPY 依赖描述文件、下依赖,再 COPY 源码,日常构建时间从六分钟降到一分半。
3、多阶段构建
编译用的工具链不需要进最终镜像,用两个 FROM 分开,构建产物从第一阶段拷过来。省下来的空间不算多,但能少几百兆的中间层。
没用的招我也试了两个。一是所谓"清理缓存",在 Dockerfile 里加删除命令,实际上那一层已经写进镜像了,删掉的文件还在里面。二是想用压缩工具直接把镜像压小,压完确实小了,但每次启动要解压,启动时间从八秒变成四十秒,得不偿失。
教训是:瘦身要动结构,别在指令层面抠。