# Multi-stage build для ordinis-app. # # COPY . ./ + root .dockerignore: один rule вместо explicit per-module # list. Когда добавляется новый Maven module в parent pom.xml — Docker # build автоматически его подхватит, без правки этого файла. Lesson из # Phase A (notifications module): explicit COPY list пропускал новый # module → `mvn -am package` падал на parent pom validation. # # .dockerignore исключает frontend (admin-ui), bench, docs, target/, .git/, # IDE metadata — backend image остаётся компактным. FROM repo.nstart.cloud/library/maven:3.9.9-eclipse-temurin-21 AS build # Git info из CI environment (`.gitlab-ci.yml` `--build-arg`) — нужен для # Spring Boot build-info goal через ordinis-app/pom.xml. Внутри Docker # context .git/ исключён (.dockerignore), поэтому git-commit-id-maven-plugin # не может прочитать локально. Defaults в pom.xml gracefully fallback'ят # если ARG'и не переданы (local docker build без ENV). ARG GIT_COMMIT=unknown ARG GIT_BRANCH=unknown # GIT_TAG defaults to "none" (не пусто): Maven property substitution трактует # empty value как null → Spring Boot build-info goal валится с # "Additional property 'tag' is illegal as its value is null". ARG GIT_TAG=none ARG GIT_TIME=unknown WORKDIR /build COPY . ./ RUN mvn -B -pl ordinis-app -am package -DskipTests \ -Dgit.commit.id.abbrev="$GIT_COMMIT" \ -Dgit.branch="$GIT_BRANCH" \ -Dgit.tags="$GIT_TAG" \ -Dgit.commit.time="$GIT_TIME" FROM repo.nstart.cloud/library/eclipse-temurin:21-jre # Non-root user — security hardening (CSO report 2026-05-27 finding #1). # Eclipse-temurin runtime image не задаёт USER by default → JVM от root. # Compromise через Spring Boot CVE / Jackson deserialization без USER # становится root-в-контейнере → escalation surface на ноду. UID 10001 # не конфликтует с system users (0-999) и distribution-reserved (1000-9999). RUN groupadd -r -g 10001 app && useradd -r -u 10001 -g app -s /sbin/nologin app WORKDIR /app COPY --from=build --chown=app:app /build/ordinis-app/target/*.jar /app/app.jar USER app EXPOSE 8080 ENTRYPOINT ["java", "-XX:+UseZGC", "-XX:MaxRAMPercentage=75", "-jar", "/app/app.jar"]