# syntax=docker/dockerfile:1

# ---- сборка ----
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /build

# Сначала только pom.xml, чтобы слой с зависимостями кэшировался отдельно от исходников
# и не перекачивался заново при каждом изменении кода.
COPY pom.xml .
RUN --mount=type=cache,target=/root/.m2 mvn -B -q dependency:go-offline

COPY src ./src
# frontend/ раньше не копировался вообще - до этой правки pom.xml не собирал фронт
# (frontend-maven-plugin был закомментирован), так что отсутствие этой строки было
# незаметно. Теперь mvn package внутри контейнера собирает React (frontend-maven-plugin
# сам качает себе Node) и кладёт результат в classpath:/static - см. pom.xml.
COPY frontend ./frontend
# Без доп. кэш-маунтов этот шаг на каждой сборке заново качал бы Node (~50 МБ,
# frontend-maven-plugin ставит свою локальную копию в frontend/node - в этом
# образе Maven+JDK никакого системного Node нет) и заново гонял npm install по сети -
# причём при ЛЮБОЙ правке (даже только Java, см. COPY src ./src выше), а не только
# при изменении фронта: Docker-кэш слоёв инвалидируется каскадно от первого
# изменившегося COPY, и COPY frontend/RUN mvn package идут ПОСЛЕ COPY src.
# Кэш-маунты обходят эту проблему по-другому: они не часть слоя (значит, порядок
# COPY на них не влияет) и переживают между сборками сами по себе, по target-пути:
#   - frontend/node       - скачанный Node/npm самого frontend-maven-plugin
#   - frontend/node_modules - установленные npm-пакеты
#   - /root/.npm           - npm-кэш registry (нужен, когда node_modules всё же
#                             приходится переустанавливать - например, после правки
#                             package.json - тогда пакеты берутся из локального
#                             кэша, а не заново качаются из сети)
# npm install/сборка (npm run build) всё равно выполняются на каждом mvn package -
# как и компиляция Java классов ниже, это дешёвая часть; экономим именно на сети/
# скачивании, а не на факте перезапуска шага целиком.
RUN --mount=type=cache,target=/root/.m2 \
    --mount=type=cache,target=/build/frontend/node \
    --mount=type=cache,target=/build/frontend/node_modules \
    --mount=type=cache,target=/root/.npm \
    mvn -B -q package -DskipTests

# ---- рантайм ----
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app

# Wildcard, чтобы не завязываться на конкретный номер версии из pom.xml.
COPY --from=build /build/target/schedule-service-*.jar app.jar

# MaxRAMPercentage вместо фиксированного -Xmx — домашний сервер слабый (11 ГБ на всё),
# лучше явно ограничить долю выделенного контейнеру лимита памяти, чем полагаться на
# дефолт JVM (25% от memory limit пода, что может быть мало под старт Hibernate).
ENV JAVA_OPTS="-XX:MaxRAMPercentage=70.0"

EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
