55 lines
3.9 KiB
Docker
55 lines
3.9 KiB
Docker
# 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"]
|