spring boot 本身不直接打包 docker 镜像,需先通过 spring-boot-maven-plugin 构建可执行 fat jar(含 boot-inf/ 和 jarlauncher),再基于该 jar 编写 dockerfile(如 from eclipse-temurin:17-jre-jammy、copy、entrypoint ["java","-jar","/app.jar"])构建轻量镜像,最后 docker build + docker run 完成部署。

Spring Boot 本身不直接打包 Docker 镜像,“Fat Jar 镜像”不是标准术语——它通常指“基于 Fat Jar 构建的 Docker 镜像”。也就是说,先用 spring-boot-maven-plugin 打出可执行 Fat Jar,再以此 Jar 为入口,用 Dockerfile 构建轻量镜像。整个过程分两步:Maven 打包 + Docker 构建,缺一不可。
确保 Maven 正确生成 Fat Jar
这是后续构建镜像的基础。若 target/ 下只有 .jar.original 而没有可执行 .jar,说明插件未生效:
- 检查
pom.xml是否声明了spring-boot-maven-plugin(尤其使用自定义 parent 时,不能依赖继承默认配置) - 确认
<packaging></packaging>是jar,不是war或空值 - 运行
mvn clean package后,查看日志是否出现[INFO] Replacing main artifact with repackaged archive - 验证生成的 Jar 是否含
BOOT-INF/目录和正确的Main-Class: org.springframework.boot.loader.JarLauncher(可用jar -tf target/*.jar | head -20查看结构)
准备用于 Docker 的 Fat Jar
打包成功后,target/ 目录下会有一个主 Jar(如 myapp-1.0.0.jar)和一个 .original 文件。只需前者:
- 该 Jar 已内嵌 Tomcat、含全部依赖、可直接
java -jar运行 - 推荐在
pom.xml中配置<classifier></classifier>区分环境(如exec-prod),但非必需 - 若项目含本地 jar(如
systemscope),需配合maven-resources-plugin将其复制到target/classes/BOOT-INF/lib/,否则运行时类找不到
编写最小化 Dockerfile
不依赖 Spring Boot 插件的 Docker 支持(如 spring-boot-maven-plugin 的 build-image goal),而是手动构建更可控:
- 基础镜像选
eclipse-temurin:17-jre-jammy(轻量、安全、兼容 Spring Boot 3.x) - 用
ARG JAR_FILE支持动态传入 Jar 名,便于 CI/CD - 只
COPYFat Jar 到镜像,不拷贝源码或target/全目录 - 设置
ENTRYPOINT ["java","-jar","/app.jar"],避免 shell 启动带来的 PID 1 问题 - 添加
EXPOSE 8080和健康检查(可选)提升运维友好性
构建并验证镜像
命令行操作清晰可靠:
- 执行
docker build -t myapp:1.0.0 --build-arg JAR_FILE=target/myapp-1.0.0.jar . - 运行
docker run -p 8080:8080 myapp:1.0.0,访问http://localhost:8080/actuator/health确认启动成功 - 用
docker history myapp:1.0.0检查层数,理想情况仅 2–3 层(基础镜像 + Jar + 元数据) - 避免使用
mvn spring-boot:build-image(需 Paketo builder、网络依赖强、定制性弱),除非团队统一采用 Cloud Native Buildpacks
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











