# syntax=docker/dockerfile:1
# =====================================================================
#  empresa-app - imagen Docker en tres etapas
#    1) construccion: compila y empaqueta con Maven y el JDK 25
#    2) capas:        separa el JAR en capas (dependencias / aplicación)
#    3) final:        solo el JRE 25 y las capas, con un usuario sin privilegios
# =====================================================================

# ---------- 1. Construcción ----------
FROM maven:3.9-eclipse-temurin-25 AS construccion
WORKDIR /fuente
# Primero solo el pom.xml: si no cambia, Docker reutiliza la capa con las dependencias
COPY pom.xml .
RUN --mount=type=cache,target=/root/.m2 mvn -q dependency:go-offline
COPY src ./src
RUN --mount=type=cache,target=/root/.m2 mvn -q package -DskipTests

# ---------- 2. Extracción de capas ----------
FROM eclipse-temurin:25-jre AS capas
WORKDIR /capas
COPY --from=construccion /fuente/target/empresa-app-*.jar application.jar
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extraido

# ---------- 3. Imagen final ----------
FROM eclipse-temurin:25-jre
LABEL org.opencontainers.image.title="empresa-app" \
      org.opencontainers.image.description="Gestión de EMPRESA - Curso de Java Avanzado"
RUN useradd --system --uid 1001 --create-home empresa
WORKDIR /application
# Cada COPY es una capa: las dependencias (que casi nunca cambian) van primero
COPY --from=capas /capas/extraido/dependencies/ ./
COPY --from=capas /capas/extraido/spring-boot-loader/ ./
COPY --from=capas /capas/extraido/snapshot-dependencies/ ./
COPY --from=capas /capas/extraido/application/ ./
RUN mkdir logs fotos && chown empresa logs fotos
USER empresa
ENV SPRING_PROFILES_ACTIVE=prod
EXPOSE 8080
# MaxRAMPercentage: la JVM ajusta su memoria al límite del contenedor
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "-jar", "application.jar"]
