Docker 多阶段构建:将 Java 镜像从 800MB 瘦身到 80MB

Raj Kumar | 2026-08-26T23:01:01 | DevOps

通过 Docker 多阶段构建、JLink 定制 JRE、Alpine 基础镜像三步走,将 Spring Boot 应用镜像缩小 10 倍。

# Docker 多阶段构建:将 Java 镜像从 800MB 瘦身到 80MB ## 问题 默认的 Spring Boot Docker 镜像基于 `eclipse-temurin:17-jdk`,包含完整 JDK + 应用,体积约 800MB。 ## 方案一:多阶段构建 + JRE ```dockerfile # 阶段1:构建 FROM eclipse-temurin:17-jdk AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # 阶段2:运行(只用 JRE) FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ``` 镜像大小:~280MB ## 方案二:JLink 定制最小 JRE ```dockerfile FROM eclipse-temurin:17-jdk AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # 分析依赖模块 RUN jdeps --ignore-missing-deps --multi-release 17 \ --print-module-deps target/*.jar > deps.info # 生成定制 JRE RUN jlink --add-modules $(cat deps.info) \ --strip-debug \ --no-man-pages \ --no-header-files \ --compress=2 \ --output /custom-jre FROM alpine:3.19 RUN apk add --no-cache libc6-compat COPY --from=builder /custom-jre /opt/java COPY --from=builder /app/target/*.jar /app/app.jar ENV PATH="/opt/java/bin:$PATH" EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"] ``` 镜像大小:~80MB! ## 方案三:Spring Boot Layered JAR ```dockerfile FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=builder /app/target/*.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=0 /app/dependencies/ ./ COPY --from=0 /app/spring-boot-loader/ ./ COPY --from=0 /app/snapshot-dependencies/ ./ COPY --from=0 /app/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"] ``` 分层后 Docker 缓存更高效,依赖层不变时只需重新构建应用层。 ## 对比 | 方案 | 镜像大小 | 构建复杂度 | |------|----------|-----------| | 默认 JDK | ~800MB | 低 | | JRE-Alpine | ~280MB | 低 | | JLink 定制 | ~80MB | 中 |

← Back to Blog