核心是打好JAR包、写对Dockerfile、配好启动参数:先执行mvn clean package -DskipTests生成target/下可执行JAR;再用多阶段Dockerfile(如maven构建+alpine运行+非root用户)构建镜像;最后docker build并docker run -p 8080:8080运行。

Java 中用 Docker 打包和运行 Spring Boot 应用,核心是把应用变成一个自带环境、可移植、开箱即用的镜像。不需要改业务代码,关键在三件事:打好 JAR 包、写对 Dockerfile、启动时配好参数。
确认项目已打包为可执行 JAR
Spring Boot 默认支持 fat-jar(含所有依赖),Maven 项目执行:
- mvn clean package -DskipTests —— 跳过测试加快构建
- 生成文件默认在 target/your-app-name.jar(如 demo-0.0.1-SNAPSHOT.jar)
- 本地验证:java -jar target/*.jar 启动后能访问 /actuator/health 或自定义接口(如 /test)
编写轻量安全的 Dockerfile
推荐使用多阶段构建,兼顾体积小、安全性高、生产可用:
- 第一阶段用 maven 镜像编译源码,生成 JAR
- 第二阶段用 openjdk:17-jre-alpine(仅含 JRE,更小更安全)
- 创建非 root 用户(如 appuser)运行应用,避免权限风险
- COPY JAR 时重命名为 app.jar,统一入口路径
- 设置 EXPOSE 8080 并指定 USER appuser
示例片段:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
FROM maven:3.9.6-eclipse-temurin-17 AS build<br>WORKDIR /app<br>COPY . .<br>RUN mvn clean package -DskipTests<br><br>FROM openjdk:17-jre-alpine<br>WORKDIR /app<br>COPY --from=build /app/target/*.jar app.jar<br>RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001<br>USER appuser<br>EXPOSE 8080<br>ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
构建并运行容器
确保当前目录含 Dockerfile 和 target/ 下的 JAR 文件:
- docker build -t my-springboot-app:1.0 . —— 构建带标签的镜像
- docker run -d -p 8080:8080 --name myapp my-springboot-app:1.0 —— 后台运行,映射端口
- 如需挂载配置或日志目录:-v $(pwd)/config:/app/config -v $(pwd)/logs:/app/logs
- 检查运行状态:docker logs myapp 或访问 http://localhost:8080/actuator/health
替代方案:Spring Boot 内置 buildpack(适合快速验证)
Spring Boot 2.3+ 支持免写 Dockerfile 的方式,自动优化镜像:
- mvn spring-boot:build-image -DskipTests —— 直接生成 OCI 镜像
- 镜像名默认为 your-group/your-artifact:version(如 com.example/demo:0.0.1-SNAPSHOT)
- docker run -p 8080:8080 com.example/demo:0.0.1-SNAPSHOT
- 优势:省去 Dockerfile 维护,自动选精简基础镜像;缺点:定制性略低,不便于细粒度控制用户、启动参数等

















