# 使用多阶段构建优化镜像大小 - 修复FROM语句大小写 FROM amazoncorretto:17-alpine-jdk AS builder # 设置工作目录 WORKDIR /app # 设置Maven镜像源(提高下载速度) RUN mkdir -p /root/.m2 && \ echo '' > /root/.m2/settings.xml && \ echo '' >> /root/.m2/settings.xml && \ echo ' ' >> /root/.m2/settings.xml && \ echo ' ' >> /root/.m2/settings.xml && \ echo ' aliyun' >> /root/.m2/settings.xml && \ echo ' Aliyun Central' >> /root/.m2/settings.xml && \ echo ' https://maven.aliyun.com/repository/central' >> /root/.m2/settings.xml && \ echo ' central' >> /root/.m2/settings.xml && \ echo ' ' >> /root/.m2/settings.xml && \ echo ' ' >> /root/.m2/settings.xml && \ echo '' # 复制Maven配置文件和脚本(利用Docker缓存) COPY pom.xml . COPY .mvn .mvn COPY mvnw . # 给mvnw脚本添加执行权限 RUN chmod +x ./mvnw # 首先只下载依赖(利用Docker层缓存) RUN ./mvnw dependency:resolve -B -q # 复制源代码 COPY src ./src # 构建应用(简化构建过程) RUN ./mvnw clean package -DskipTests -B -q # 运行时镜像 - 使用更小的Alpine镜像 FROM amazoncorretto:17-alpine # 安装curl用于健康检查 RUN apk add --no-cache curl # 设置时区 ENV TZ=Asia/Shanghai RUN apk add --no-cache tzdata && \ ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 创建非root用户 RUN addgroup -g 1000 spring && adduser -u 1000 -G spring -s /bin/sh -D spring # 创建应用目录 WORKDIR /app # 从构建阶段复制jar文件 COPY --from=builder /app/target/*.jar app.jar # 创建日志目录 RUN mkdir -p /app/logs && chown -R spring:spring /app # 切换到非root用户 USER spring # 暴露端口 EXPOSE 8080 # 健康检查 - 使用Spring Boot Actuator标准端点 HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || curl -f http://localhost:8080/api/health || exit 1 # JVM调优参数 ENV JAVA_OPTS="-server -Xms256m -Xmx512m -XX:+UseG1GC -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0" # 启动应用 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar"]