多阶段构建可将Spring Boot镜像从600MB+压缩至约150MB:第一阶段用JDK镜像打包,第二阶段用JRE镜像仅复制JAR;Spring Boot 2.3+还可结合layertools分层提升缓存效率,并需配置非root用户、JVM容器参数及健康检查。

用多阶段构建减小镜像体积
Spring Boot 项目打成的可执行 JAR 包本身不大,但直接用含完整 JDK 的基础镜像(比如 openjdk:17-jdk-slim)构建,最终镜像往往超过 500MB。问题出在:构建阶段需要 JDK 编译、打包,但运行时只需要 JRE。多阶段构建就是把“构建”和“运行”拆开,只把运行必需的文件复制到精简的运行镜像里。
标准两阶段写法(推荐)
一个典型、安全、轻量的 Dockerfile 结构如下:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
-
第一阶段(build):用带 JDK 和构建工具的镜像(如
eclipse-temurin:17-jdk-focal),执行 Maven 打包,生成 JAR -
第二阶段(runtime):用纯 JRE 镜像(如
eclipse-temurin:17-jre-focal),只 COPY 第一阶段产出的 JAR,不带任何编译工具、源码或依赖缓存 - 运行镜像体积通常能从 600MB+ 压缩到 150MB 左右,启动更快,攻击面更小
进阶优化:利用 Spring Boot 2.3+ 的分层打包特性
如果你用的是 Spring Boot 2.3 或更高版本,Maven 打包时默认启用 layertools,支持将 JAR 拆成 dependencies、spring-boot-loader、snapshot-dependencies、application 四层。这能让 Docker 层级缓存更高效:
- 业务代码变,只重传
application层;依赖不变,复用已缓存的dependencies层 - 第二阶段 RUN 命令示例:
RUN java -Djarmode=layertools -jar app.jar extract - 接着 COPY 各层目录(如
COPY --from=builder dependencies/ ./),再组合启动
别忽略的关键细节
光写对阶段还不够,这些点直接影响生产可用性:
- 非 root 用户运行:RUN useradd -m appuser && USER appuser,避免容器以 root 权限运行 Java 进程
-
JVM 容器感知参数:加上
-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0,让 JVM 正确识别容器内存限制 -
健康检查:添加
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/actuator/health || exit 1 - 暴露端口 + 环境变量:EXPOSE 8080,配合 SPRING_PROFILES_ACTIVE 等变量灵活切换环境

















