# ============================================================================= # Etage 1 : compilation # Le build tourne dans le conteneur, avec le JDK 21 exact de la cible. Aucune # dependance au JDK de la machine qui lance le build - la machine de dev est # en 17, le serveur n'a pas de JDK du tout. # ============================================================================= FROM maven:3.9-eclipse-temurin-21 AS build WORKDIR /build # Les dependances changent rarement, le code souvent. En copiant le pom seul # d'abord, un simple changement de code ne re-telecharge pas tout Maven Central. COPY pom.xml . RUN --mount=type=cache,target=/root/.m2 mvn -B dependency:go-offline -q COPY src ./src # Les tests unitaires et les regles ArchUnit tournent ICI : une violation de # l'architecture hexagonale casse le build de l'image, pas la production. # Les tests d'integration Testcontainers sont exclus (groupe "integration"), # ils demanderaient un Docker dans le Docker. RUN --mount=type=cache,target=/root/.m2 mvn -B clean package # ============================================================================= # Etage 2 : execution # JRE seul, sans Maven ni sources : ~180 Mo au lieu de ~900 Mo. # ============================================================================= FROM eclipse-temurin:21-jre-alpine # wget pour le healthcheck, tzdata pour des logs a l'heure de Paris. RUN apk add --no-cache wget tzdata && \ addgroup -S alarm && adduser -S alarm -G alarm WORKDIR /app COPY --from=build --chown=alarm:alarm /build/target/*.jar app.jar USER alarm EXPOSE 8080 ENV TZ=Europe/Paris \ JAVA_OPTS="-XX:MaxRAMPercentage=70 -XX:+UseSerialGC -XX:TieredStopAtLevel=1" # MaxRAMPercentage plutot que -Xmx : la JVM lit la limite du cgroup, le reglage # suit donc la limite du conteneur sans etre redefini a deux endroits. # SerialGC : sur 2 vCPU partages, G1 coute plus en threads qu'il ne rapporte. HEALTHCHECK --interval=20s --timeout=4s --start-period=75s --retries=4 \ CMD wget -qO- http://localhost:8080/actuator/health/readiness | grep -q UP || exit 1 ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"]