如何进一步优化Dockerfile镜像大小?1.35GB多项目CI镜像如何瘦身
可行的镜像体积优化方案
1. 裁剪JDK体积,优先使用自定义JRE
当前你使用的全量JDK12占了350MB空间,CI场景下绝大多数情况不需要完整JDK的开发能力,可以用jlink命令裁剪出仅包含所需模块的自定义JRE:
- 只保留项目运行必须的Java模块,裁剪后体积通常可以降到50-100MB,直接减少250MB以上的占用
- 也可以直接选用官方发布的JRE镜像替代完整JDK镜像,无需手动裁剪
2. 替换更小的基础镜像
当前用的ubuntu:18.04基础镜像本身就有近50MB的体积,可根据兼容性要求替换:
- 优先选
ubuntu:18.04-slim或debian:buster-slim这类轻量系统基础镜像,体积比标准版小30%以上 - 如果所有依赖都能适配musl libc,可以换用alpine基础镜像,基础体积仅5MB左右,能大幅降低系统层占用
3. 清理不必要的系统依赖
你当前apt安装的部分依赖属于临时使用或非必须:
- 安装完成nodejs源后,可以卸载
software-properties-common、apt-transport-https这类仅用于添加源的工具包,不需要保留在最终镜像中 - 确认
build-essential是否为必须:如果你的CI流程不需要编译C/C++类依赖,直接卸载这个包就能减少近200MB的空间占用 - 安装apt包时额外添加
--no-install-suggests参数,进一步减少不必要的依赖安装 - 清理系统冗余的locale文件、man文档、帮助文档,可直接删掉
/usr/share/man/、/usr/share/doc/下的所有内容
4. 优化Node.js、Groovy的安装方式
- 不要通过sdkman安装Groovy,直接下载Groovy的官方二进制压缩包,解压后仅保留运行必须的bin和lib目录,完全剔除sdkman本身的冗余文件,可减少至少50MB的占用
- Node.js不要通过apt安装,直接下载官方预编译的二进制包,解压后删除包含的文档、测试用例等冗余文件,仅保留node、npm、npx等可执行文件和必要的库文件,体积比apt安装版本小30%左右
- 全局安装npm包时合并为单条命令,添加
--production --no-optional参数,跳过开发依赖和可选依赖的安装,减少npm包的体积
5. 采用多阶段构建
把所有依赖的下载、编译、安装流程都放到第一个构建阶段,第二个阶段只从构建阶段拷贝需要的运行时文件到干净的基础镜像中:
- 构建阶段产生的所有临时文件、下载的安装包、编译缓存都不会进入最终镜像
- 可以完全剔除所有构建过程的冗余内容,通常能减少20%以上的最终镜像体积
6. 后处理压缩
镜像构建完成后可以用docker-slim这类工具做二次压缩:
- 自动识别并删除镜像里所有从未被访问到的冗余文件
- 处理过程不需要修改Dockerfile,兼容性好,通常还能再压缩10%-20%的体积
内容的提问来源于stack exchange,提问作者BearsTester
相关产品推荐
相关产品推荐

