核心是将spring boot可执行jar包嵌入轻量、可复现的linux容器环境:先执行mvn clean package生成fat jar,再通过多阶段dockerfile(构建阶段用maven镜像编译,运行阶段用openjdk:17-jre-slim仅含jre)构建镜像,最后docker build -t my-spring-app .并docker run -p 8080:8080运行验证。

在 Java 中将 Spring Boot 应用打包为 Docker 镜像,核心是把编译好的 JAR 包放进轻量、可复现的 Linux 容器环境里运行。推荐使用官方推荐的 分层构建(multi-stage build) 或直接基于 openjdk 基础镜像的精简方式,避免把 JDK 和构建工具一起打进最终镜像。
准备:确保项目可独立运行
Spring Boot 默认会把所有依赖打包进 fat jar,这是 Docker 化的前提:
- 确认
pom.xml中spring-boot-maven-plugin已启用(Spring Boot 2.3+ 默认开启) - 执行
mvn clean package,生成target/*.jar(如myapp-0.0.1-SNAPSHOT.jar) - 本地验证:运行
java -jar target/myapp-0.0.1-SNAPSHOT.jar能正常启动
编写 Dockerfile(推荐多阶段构建)
利用 Maven 构建阶段只保留最终 JAR,不把 JDK、Maven 等工具塞进生产镜像:
# 构建阶段:使用 Maven 官方镜像编译
FROM maven:3.9-openjdk-17-slim AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn package -DskipTests
<h1>运行阶段:仅含 JRE 的轻量镜像</h1><p>FROM openjdk:17-jre-slim
VOLUME ["/tmp"]
ARG JAR_FILE=target/*.jar
COPY --from=builder ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]</p>说明:
-
--from=builder只拷贝上一阶段生成的 JAR,不带源码和构建缓存 -
openjdk:17-jre-slim比 full JDK 小约 200MB,适合生产 -
-Djava.security.egd=...加速 Spring Boot 启动(避免熵池阻塞)
构建并运行镜像
在项目根目录执行:
-
docker build -t my-spring-app .(构建镜像) -
docker run -p 8080:8080 my-spring-app(默认暴露 8080) - 访问
http://localhost:8080/actuator/health(若启用了 actuator)验证运行状态
如需自定义配置,可用 -e 传参或挂载配置文件:
docker run -p 8080:8080 \ -e "SPRING_PROFILES_ACTIVE=docker" \ -v $(pwd)/application-docker.yml:/app/config/application.yml \ my-spring-app
进阶建议
- 用
.dockerignore排除target/、src/、pom.xml等非必需文件,加快构建缓存命中 - Spring Boot 3.x + GraalVM 原生镜像更小更快,但需额外适配;常规场景 JAR + JRE 已足够
- CI/CD 中建议固定基础镜像 tag(如
openjdk:17-jre-slim-bookworm),避免因镜像更新导致行为变化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











