53 lines
2.1 KiB
Text
53 lines
2.1 KiB
Text
|
|
# =============================================================================
|
||
|
|
# 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"]
|