# ===================================================================== # 翼云Hub · LAOP-admin 后端镜像 Dockerfile # -------------------------------------------------------------------- # 设计:本地 mvn package 预先生成 jar,Dockerfile 只 COPY jar 进 JRE 镜像 # -------------------------------------------------------------------- # 为什么不用多阶段构建(FROM maven → mvn package → FROM jre)? # - 多阶段构建在镜像内执行 mvn package,每次都要下载依赖,慢 # - 跨架构构建(Mac arm64 → 服务器 x86_64)需 QEMU 模拟,慢上加慢 # - Java 字节码与 CPU 架构无关,本地 Mac 编译的 jar 可直接跑在 x86_64 JRE 上 # 改进后: # - 本地 mvn package 秒级完成(原生速度,无跨架构) # - Dockerfile 只 COPY jar,构建瞬间完成 # - 不需要 QEMU,不需要基础镜像固化依赖 # -------------------------------------------------------------------- # 前置:本地执行过 mvn clean package -DskipTests -Pprod # 生成 target/laop-admin.jar # 脚本 build-and-push.sh 会自动完成这步并复制到 build context # ===================================================================== FROM eclipse-temurin:17-jre-jammy LABEL maintainer="laop-admin" LABEL description="无人机信息开放平台 后端服务" 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 # 拷贝本地预编译好的 jar 包 # 脚本 build-and-push.sh 在构建前会执行: # cp target/laop-admin.jar ./laop-admin.jar # 把 jar 复制到 build context 根目录(避免把整个 target/ 进入上下文) COPY laop-admin.jar app.jar # 容器内暴露端口(与 application.yml server.port=8081 一致) EXPOSE 8081 # JVM 参数:容器内内存限制感知 + GC 优化(2核8G 服务器) 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"]