# ============================================ # 服务构建 Dockerfile # 基于依赖基础镜像,快速编译服务 # ============================================ # 构建参数 ARG DEPS_IMAGE=aiot-deps:latest # ============ 构建阶段 ============ FROM ${DEPS_IMAGE} AS builder ARG MODULE_NAME ARG JAR_NAME ARG SKIP_TESTS=true WORKDIR /build # 复制最新源代码(覆盖基础镜像中的代码) COPY . . # 构建应用 RUN echo "========================================" && \ echo "🔨 Building module: ${MODULE_NAME}" && \ echo "📦 JAR name: ${JAR_NAME}" && \ echo "⏭️ Skip tests: ${SKIP_TESTS}" && \ echo "========================================" && \ mvn package -pl ${MODULE_NAME} -am \ -DskipTests=${SKIP_TESTS} \ -B \ --no-transfer-progress && \ echo "✅ Build completed successfully!" && \ ls -lh ${MODULE_NAME}/target/*.jar # ============ 运行阶段 ============ FROM eclipse-temurin:17-jre-alpine # 安装必要工具 RUN apk add --no-cache wget curl # 构建参数 ARG MODULE_NAME ARG JAR_NAME ARG APP_PORT=48080 # 元数据标签 LABEL maintainer="XW-AIOT Team" LABEL service="${MODULE_NAME}" # 创建非 root 用户 RUN addgroup -g 1000 appuser && \ adduser -D -u 1000 -G appuser appuser # 创建应用目录 RUN mkdir -p /app/logs /app/config && \ chown -R appuser:appuser /app WORKDIR /app # 从构建阶段复制 JAR 文件 COPY --from=builder --chown=appuser:appuser /build/${MODULE_NAME}/target/${JAR_NAME}.jar app.jar # 切换到非 root 用户 USER appuser # 环境变量 ENV TZ=Asia/Shanghai \ JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200" \ SPRING_PROFILES_ACTIVE=prod # 暴露端口 EXPOSE ${APP_PORT} # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:${APP_PORT}/actuator/health || exit 1 # 启动应用 ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar"]