# --- Etapa 1: build --- # Compila el jar con el Gradle wrapper del proyecto (no requiere Gradle en host). FROM eclipse-temurin:21-jdk AS build WORKDIR /app # Primero solo lo necesario para resolver dependencias y aprovechar la caché de capas. COPY gradlew settings.gradle build.gradle ./ COPY gradle ./gradle RUN chmod +x gradlew && ./gradlew --no-daemon dependencies > /dev/null 2>&1 || true # Ahora el código fuente y el empaquetado. COPY src ./src RUN ./gradlew --no-daemon clean bootJar # --- Etapa 2: runtime --- # Imagen mínima con JRE 21. Usuario no-root y zona horaria del negocio. FROM eclipse-temurin:21-jre AS runtime WORKDIR /app ENV TZ=Europe/Madrid # Usuario sin privilegios. RUN useradd --system --uid 10001 --create-home appuser USER appuser COPY --from=build /app/build/libs/*.jar app.jar EXPOSE 8080 # Healthcheck contra el endpoint de Actuator (solo health expuesto). HEALTHCHECK --interval=15s --timeout=3s --start-period=40s --retries=5 \ CMD wget -qO- http://localhost:8080/actuator/health | grep -q '"status":"UP"' || exit 1 ENTRYPOINT ["java", "-jar", "/app/app.jar"]