核心是将Spring Boot项目打包为含BOOT-INF的fat-jar,再通过多阶段Dockerfile构建轻量、安全、可复现镜像:builder阶段用maven编译并缓存依赖,runtime阶段用eclipse-temurin:17-jre-jammy等精简镜像,创建非root用户、设JVM参数、加健康检查,并打带Git commit标签的镜像。

Java 微服务容器化打包镜像,核心是把 Spring Boot 项目打成可执行的 fat-jar,再用 Dockerfile 构建轻量、安全、可复现的镜像。不改业务代码,重点在构建流程和运行约束。
确保打出标准 fat-jar
Spring Boot 默认启用 spring-boot-maven-plugin,它会把依赖、配置、启动类全打进一个 JAR:
- 执行
mvn clean package -DskipTests,生成文件在target/*.jar - 本地验证:运行
java -jar target/*.jar,能访问/actuator/health返回{"status":"UP"}即说明可执行 - 检查 JAR 内部是否有
BOOT-INF/目录——这是 Spring Boot fat-jar 的关键标志
写生产级多阶段 Dockerfile
避免把 Maven、JDK、源码塞进最终镜像,用 builder + runtime 两阶段分离:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
-
Builder 阶段:用
maven:3.9-eclipse-temurin-17编译,加--mount=type=cache,target=/root/.m2加速依赖复用 -
Runtime 阶段:选轻量基础镜像,如
eclipse-temurin:17-jre-jammy(推荐)或openjdk:17-jre-slim;慎用 Alpine(注意 glibc 兼容性) - 创建非 root 用户:
RUN adduser -S appuser && chown -R appuser:appuser /app,再USER appuser - COPY 构建产物:
COPY --from=builder /build/target/*.jar ./app.jar - 设环境变量:
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx512m" - 加健康检查:
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/actuator/health || exit 1
构建与打标签的关键操作
镜像不是 build 完就结束,构建时就要带版本和上下文信息:
立即学习“Java免费学习笔记(深入)”;
- 打标签并关联代码版本:
docker build -t user-service:1.0.0 --label "commit=$(git rev-parse HEAD)" . - 若用 Maven 插件自动化(如
dockerfile-maven-plugin),可在pom.xml中配置<buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs> - 一条命令打包+构建+推送(需插件支持):
mvn clean install dockerfile:build dockerfile:push -Ddockerfile.tag=1.0.0
运行前要确认的几件事
镜像构建成功只是第一步,真正运行前需明确外部依赖和行为约束:
- 暴露端口、激活 profile:
docker run -d -p 8080:8080 --name user-svc -e SPRING_PROFILES_ACTIVE=prod user-service:1.0.0 - 挂载外部配置目录:
-v $(pwd)/config:/app/config,让application-prod.yml等生效 - 日志建议落盘:
-v /var/log/user-svc:/app/logs,并在logback-spring.xml中指定logs/app.log - 查启动日志:
docker logs -f user-svc,重点关注是否出现Connection refused(端口冲突)、ClassNotFoundException(jar 不完整)等错误

















