# ============================================ # Build stage with optimized cache strategy # 优化缓存:分离 POM 和源代码复制 # ============================================ FROM maven:3.8-openjdk-8 AS builder ARG BUILD_NUMBER=local ARG GIT_COMMIT=unknown ARG MAVEN_OPTS=-Dmaven.wagon.http.ssl.insecure=true ENV MAVEN_OPTS="${MAVEN_OPTS}" WORKDIR /build # 第一层:复制 POM 和 common 完整源代码(缓存关键) COPY pom.xml . COPY shop-recycle-common/ shop-recycle-common/ COPY shop-recycle-gateway/pom.xml shop-recycle-gateway/ COPY shop-recycle-order-service/pom.xml shop-recycle-order-service/ COPY shop-recycle-payment-service/pom.xml shop-recycle-payment-service/ # 第二层:构建 common 模块(完整源代码可用) RUN mvn install -pl shop-recycle-common \ -DskipTests -B -q \ -Dmaven.test.skip=true # 第三层:仅下载依赖(POM 未变时可复用此层) RUN mvn dependency:go-offline -B -q \ -pl shop-recycle-order-service \ -am # 第四层:复制源代码(变化频繁,但前面的缓存都是热的) COPY shop-recycle-order-service/ shop-recycle-order-service/ # 第五层:编译(无 clean 保留缓存) RUN mvn package -DskipTests -B -q \ -pl shop-recycle-order-service \ -am \ -Dmaven.test.skip=true \ -Ddocker.build.number=${BUILD_NUMBER} \ -Dgit.commit=${GIT_COMMIT} # ============================================ # Runtime stage - ultra-minimal image # 使用Alpine基础镜像,可进一步用distroless替代 # ============================================ FROM openjdk:8-jre-alpine LABEL maintainer="shop-recycle" LABEL service="shop-recycle-order-service" LABEL build.number=${BUILD_NUMBER} LABEL git.commit=${GIT_COMMIT} ENV TZ=Asia/Shanghai ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200" WORKDIR /app # Copy built jar from builder stage COPY --from=builder /build/shop-recycle-order-service/target/*.jar order-service.jar EXPOSE 8081 # Health check (在Alpine中wget比curl更轻量) HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8081/health || exit 1 ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar order-service.jar"]