# ===================================================================== # 翼云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"]