blob: 8c3fa5b400688f1020eb930acbc9c774e419fec6 [file] [log] [blame]
ZBD4b0e05a2025-06-08 18:11:26 +08001# 阶段 1: builder - 构建应用 JAR 包并准备分层结构
ZBDb704c9f2025-05-23 21:51:39 +08002# 使用包含 Maven 和 JDK 的基础镜像
ZBDc7746b42025-05-10 01:42:30 +08003FROM maven:3.9.9-eclipse-temurin-24-alpine AS builder
4
ZBDb704c9f2025-05-23 21:51:39 +08005# 设置工作目录
ZBDc7746b42025-05-10 01:42:30 +08006WORKDIR /app
7
ZBDb704c9f2025-05-23 21:51:39 +08008# 复制 pom.xml 文件,以便 Maven 可以下载依赖
ZBD4b0e05a2025-06-08 18:11:26 +08009# 这一步利用 Docker 缓存,如果 pom.xml 没有变化,则不会重新下载依赖
ZBDb704c9f2025-05-23 21:51:39 +080010COPY pom.xml .
11
ZBD4b0e05a2025-06-08 18:11:26 +080012# 复制项目源代码
ZBDb704c9f2025-05-23 21:51:39 +080013COPY src ./src
14
ZBD4b0e05a2025-06-08 18:11:26 +080015# 执行 Maven package 构建项目
16# spring-boot-maven-plugin 会生成一个可执行 JAR (例如 demo-0.0.1-SNAPSHOT.jar),
17# 并且在 target 目录下也会有 BOOT-INF/lib (所有依赖) 和 BOOT-INF/classes (您的应用代码) 等分层结构
ZBDb704c9f2025-05-23 21:51:39 +080018RUN mvn package -DskipTests
19
20
ZBD4b0e05a2025-06-08 18:11:26 +080021# 阶段 2: runner - 运行最终应用 JAR 包的精简运行时环境
22# 使用轻量级的 OpenJDK JRE 镜像,只包含运行时环境,减小镜像大小
ZBDb704c9f2025-05-23 21:51:39 +080023FROM openjdk:17-jdk-slim-buster AS runner
ZBDc7746b42025-05-10 01:42:30 +080024WORKDIR /app
25
ZBD4b0e05a2025-06-08 18:11:26 +080026# 复制可执行 jar 包
ZBDc7746b42025-05-10 01:42:30 +080027COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
28
ZBD4b0e05a2025-06-08 18:11:26 +080029# 暴露端口
ZBDc7746b42025-05-10 01:42:30 +080030EXPOSE 8080
31
ZBD4b0e05a2025-06-08 18:11:26 +080032# 直接运行 Spring Boot JAR(推荐方式)
33ENTRYPOINT ["java", "-jar", "app.jar"]