# --- Stage 1: Build & Dependencies --- FROM maven:3.9-eclipse-temurin-21-alpine AS build WORKDIR /app # 1. Copiamos los archivos de configuración (Estructura de poms) COPY pom.xml . COPY application/pom.xml ./application/ COPY bootstrap/pom.xml ./bootstrap/ COPY domain/pom.xml ./domain/ COPY infrastructure/pom.xml ./infrastructure/ # 2. Descargamos dependencias (Cacheamos esta capa) # Usamos install de los poms para que los módulos se reconozcan entre sí RUN mvn dependency:go-offline -B # 3. Copiamos el código fuente y compilamos COPY application/src ./application/src COPY bootstrap/src ./bootstrap/src COPY domain/src ./domain/src COPY infrastructure/src ./infrastructure/src RUN mvn clean package -DskipTests -B # --- Stage 2: Run (Imagen final ligera) --- FROM eclipse-temurin:21-jre-alpine WORKDIR /app # Seguridad: Usuario no-root RUN addgroup -S app && adduser -S app -G app RUN mkdir -p /app/tmp && chown app:app /app/tmp && chmod 777 /app/tmp USER app:app # Copiamos solo el JAR final (ajustado a tu módulo bootstrap) COPY --from=build /app/bootstrap/target/bootstrap-*.jar app.jar # Configuración de Memoria y Rendimiento para Microservicios # -XX:+UseSerialGC: Menos consumo de RAM para apps < 1GB # -XX:TieredStopAtLevel=1: Arranque más rápido y menos uso de RAM del compilador JIT # -XX:MaxRAMPercentage: Se ajusta dinámicamente al límite de Docker ENV JAVA_OPTS="-XX:+UseContainerSupport \ -XX:MaxRAMPercentage=75.0 \ -XX:+UseSerialGC \ -XX:TieredStopAtLevel=1 \ -Xms128m" EXPOSE 80 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]