多阶段构建核心是分离编译与运行:第一阶段用maven:3.9-openjdk-17等重镜像编译生成jar,第二阶段用eclipse-temurin:17-jre-alpine等轻镜像仅运行jar,镜像从1.2gb降至150–200mb,缩小攻击面并加速冷启动。

多阶段构建在 Java 项目里,核心就是把“编译”和“运行”彻底分开——编译用重镜像,运行用轻镜像,中间只传一个 .jar 文件。
分清楚两个关键阶段
第一阶段叫 builder,负责编译打包。用 maven:3.9-openjdk-17 或 gradle:8-jdk17 这类带完整 SDK 的镜像,执行 mvn package 或 gradle build,生成 target/*.jar。这阶段可以大,但要干净:
- 先
COPY pom.xml再RUN mvn dependency:go-offline,利用 Docker 层缓存,避免每次改代码都重下依赖 - 源码
COPY src ./src放在依赖下载之后 - 构建完加一句
RUN rm -rf ~/.m2/repository清掉 Maven 本地仓,防止缓存被意外复制
第二阶段叫 runtime,专注交付。别用 openjdk:17-jdk-slim——它还是 JDK 全量版,含 javac、jconsole 等 400MB+ 冗余组件。推荐:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
eclipse-temurin:17-jre-alpine(约 120–150MB,带 ca-certificates,兼容 Spring Boot 3.x) - 或
gcr.io/distroless/java17(仅 ~15MB,无 shell,适合高安全场景) - 绝对不用
scratch:Java 应用依赖 glibc 和 TLS 证书,硬切会报No such file or directory
COPY 要精准,不能偷懒
- ✅
COPY --from=builder /app/target/app.jar /app.jar - ❌ 不要
COPY --from=builder /app/target/ .—— 会把test-*.jar、original-*.jar全拷进去
配套动作不能少
- 在项目根目录加
.dockerignore,至少包含:.gittarget/**/test/***.imlsecrets.json - 构建时启用 BuildKit(Docker 默认已开启),能更好处理多阶段缓存和并发
Spring Boot 镜像通常从 1.2GB 直降到 150–200MB,攻击面缩小,冷启动变快,CI/CD 传输也明显提速。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










