# =====================================================================
# 翼云Hub · LAOP-admin 后端镜像 Dockerfile
# --------------------------------------------------------------------
# 说明：
# - 项目 pom.xml 指定 Java 17（source/target），编译期和运行期版本严格一致，
# - jar 包最终名为 laop-admin.jar（由 pom.xml finalName 决定）。
# =====================================================================

# -------------------------------------------------------------------
# 阶段1：构建期（maven + jdk17，与 pom.xml 严格对齐）
# -------------------------------------------------------------------
FROM maven:3.9-eclipse-temurin-17 AS builder

WORKDIR /build

# 先单独 COPY pom.xml，利用 Docker 缓存层加速依赖下载
COPY pom.xml ./
# 预下载依赖（仅当 pom 变化时重新执行，提升后续构建速度）
RUN mvn dependency:go-offline -B

# 复制源码
COPY src ./src

# 打包：激活 prod profile，让 application.yml 中的 @spring.profiles.active@ 替换为 prod
# -DskipTests：构建镜像时跳过测试，测试应在 CI 流水线单独执行
RUN mvn clean package -DskipTests -Pprod


# -------------------------------------------------------------------
# 阶段2：运行期（JRE 17 LTS）
# -------------------------------------------------------------------
FROM eclipse-temurin:17-jre-jammy

LABEL maintainer="laop-admin"
LABEL description="翼云Hub · 无人机信息开放平台 后端服务"

WORKDIR /app

# 时区设置为中国时区（与 application.yml 中 jackson.time-zone 一致）
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 预创建静态文件挂载目录 /data/static
# - compose 通过 volumes 挂载宿主机 /home/laop/admin 到此处，持久化上传文件
# - 这里显式创建是为了：即使未挂载（如直接 docker run 调试），代码写文件也不会因目录缺失失败
# - 同时通过 ENV LAOP_STATIC_DIR=/data/static 给镜像内置默认值，与 compose 挂载点对齐
RUN mkdir -p /data/static
ENV LAOP_STATIC_DIR=/data/static

# 拷贝构建产物
COPY --from=builder /build/target/laop-admin.jar app.jar

# 容器内暴露端口（与 application.yml server.port=8081 一致）
EXPOSE 8081

# JVM 参数：容器内内存限制感知 + GC 优化（2核8G 服务器）
# -XX:+UseContainerSupport：让 JVM 感知 cgroup 限制（JDK10+ 默认开启，显式声明）
# -XX:MaxRAMPercentage=75.0：限制堆内存占容器内存 75%，给非堆留空间
# -Djava.security.egd=file:/dev/./urandom：加速 SecureRandom 启动
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/./urandom"

# 运行：显式指定 prod profile，覆盖任何默认配置
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar --spring.profiles.active=prod"]
