打包与容器部署
约 793 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › Spring Boot › 生产部署 › 打包与容器部署
Spring Boot 应用可打包为可执行 JAR 直接运行,也适合容器化部署。本节覆盖 Maven 打包、配置外置与 Docker 镜像构建。
可执行 JAR
Spring Boot Maven 插件将应用打包为 fat JAR,包含所有依赖和内嵌容器:
mvn clean package -DskipTests
java -jar target/demo-0.0.1-SNAPSHOT.jar指定 Profile
java -jar demo.jar --spring.profiles.active=prod
# 或通过环境变量
export SPRING_PROFILES_ACTIVE=prod
java -jar demo.jar配置外置
Spring Boot 支持从外部加载配置,优先级高于 JAR 内的配置文件:
# 从外部目录加载 application.yml
java -jar demo.jar --spring.config.additional-location=file:/etc/myapp/
# 或通过环境变量指定
export SPRING_CONFIG_ADDITIONAL_LOCATION=file:/etc/myapp/外部目录结构示例:
/etc/myapp/
├── application.yml
└── application-prod.ymlDocker 化
Dockerfile(多阶段构建)
# 第一阶段:编译
FROM maven:3.9-eclipse-temurin-17-alpine AS builder
WORKDIR /build
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
# 第二阶段:运行
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /build/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]构建并运行:
docker build -t myapp .
docker run -d -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e DB_PASSWORD=secret \
-v /etc/myapp:/etc/myapp \
myapp优化 JAR 分层(Spring Boot 2.3+)
大幅减小镜像尺寸和构建时间:
FROM eclipse-temurin:17-jre-alpine AS builder
WORKDIR /app
COPY target/*.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]利用分层缓存,只有 application/ 层随代码变更,dependencies/ 层可跨构建复用。
生产意识:生产环境建议在 Dockerfile 中添加非 root 用户运行,避免容器以 root 权限启动引发的安全风险:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser在 JVM 参数方面,生产容器内存需要根据容器限制显式设置:
-XX:MaxRAMPercentage=75.0(JDK 8u191+ / 10+)。如果不设置,JVM 默认取宿主机物理内存的 1/4 作为堆上限,在共享宿主机上可能导致 OOM Kill。同时,Docker 时区问题也常被忽略——ENV TZ=Asia/Shanghai应在 Dockerfile 中设置,或通过 Pod 的timezone字段指定。
健康检查与就绪探针
在 Dockerfile 中添加健康检查:
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1Kubernetes 就绪探针:
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10需要在 application.yml 中添加:
management:
endpoint:
health:
probes:
enabled: true小结
mvn clean package生成可执行 JAR,java -jar直接运行。- 配置通过
--spring.profiles.active、环境变量、spring.config.additional-location外置。 - Docker 多阶段构建减小运行时镜像体积。
- Actuator 提供健康检查端点,配合 Kubernetes liveness / readiness 探针实现容器自愈。
- 易错:fat JAR 不是普通的 JAR——不能通过外部
-cp引用其中的类。生产环境必须显式指定 Profile(不要依赖默认值)。Docker 容器时区默认 UTC,需要在 Dockerfile 中设置ENV TZ=Asia/Shanghai。 - 思考任务:为项目编写 Dockerfile 进行多阶段构建,使用 Actuator Health 端点作为 Kubernetes 探针,验证容器启动后健康检查通过。
上一节:Actuator 监控
