Dockerfile 2.3 KB

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