Java 应用 Docker 镜像动辄 1GB+,拉取慢、占用大。多阶段构建 + Alpine + JRE 裁剪,把镜像瘦到 150MB。

一、镜像大小分析

  • 1.1 docker images 查看镜像大小
  • 1.2 docker history <image>——每一层的大小
  • 1.3 罪魁祸首——基础镜像大、构建依赖残留

二、优化 1:选择精简基础镜像

  • 2.1 openjdk:8 → 600MB
  • 2.2 openjdk:8-jre-alpine → 84MB
  • 2.3 eclipse-temurin:17-jre-alpine → 180MB
  • 2.4 Alpine 的问题——musl libc 可能不兼容

三、优化 2:多阶段构建

  • 3.1 第一阶段——Maven/Gradle 构建(包含 JDK)
  • 3.2 第二阶段——只复制 JAR 包 + JRE
  • 3.3 COPY --from=builder 跨阶段复制
  • 3.4 完整的 Dockerfile 示例

四、优化 3:JRE 裁剪

  • 4.1 jlink 创建自定义 JRE——只包含需要的模块
  • 4.2 jdeps 分析依赖——生成模块列表
  • 4.3 jlink --add-modules java.base,java.sql,java.naming --output /opt/jre
  • 4.4 效果——JRE 从 200MB 剪到 50MB

五、优化 4:.dockerignore

  • 5.1 排除不需要的文件——target/ 之外的所有
  • 5.2 排除 .git、node_modules、logs

六、优化 5:层缓存优化

  • 6.1 先 COPY 依赖——利用 Docker 构建缓存
  • 6.2 频繁变化的文件放在最后

七、最终效果

  • 优化前——1.2GB
  • 优化后——150MB
  • 拉取时间——30s → 3s
  • 完整的 Dockerfile 对比

八、总结

  • 多阶段构建是镜像瘦身的必杀技
  • Alpine + jlink 是极致方案