2026-04-06 15:51:59 +02:00
|
|
|
# syntax=docker/dockerfile:1
|
|
|
|
|
|
|
|
|
|
# Frontend: runs natively on build host
|
|
|
|
|
FROM --platform=$BUILDPLATFORM node:22-alpine AS frontend
|
|
|
|
|
ARG REGISTRY_TOKEN
|
|
|
|
|
WORKDIR /ui
|
|
|
|
|
COPY ui/package.json ui/package-lock.json ui/.npmrc ./
|
2026-04-06 22:29:14 +02:00
|
|
|
RUN --mount=type=cache,target=/root/.npm echo "//gitea.siegeln.net/api/packages/cameleer/npm/:_authToken=${REGISTRY_TOKEN}" >> .npmrc && npm ci
|
2026-04-06 15:51:59 +02:00
|
|
|
COPY ui/ .
|
|
|
|
|
RUN npm run build
|
|
|
|
|
|
|
|
|
|
# Maven build: runs natively on build host (no QEMU emulation)
|
|
|
|
|
FROM --platform=$BUILDPLATFORM eclipse-temurin:21-jdk-alpine AS build
|
|
|
|
|
WORKDIR /build
|
|
|
|
|
COPY .mvn/ .mvn/
|
|
|
|
|
COPY mvnw pom.xml ./
|
2026-04-06 22:29:14 +02:00
|
|
|
# Cache deps — BuildKit cache mount persists across --no-cache builds
|
2026-04-26 20:55:41 +02:00
|
|
|
RUN --mount=type=cache,target=/root/.m2/repository ./mvnw dependency:go-offline -U -B || true
|
2026-04-06 15:51:59 +02:00
|
|
|
COPY src/ src/
|
|
|
|
|
COPY --from=frontend /ui/dist/ src/main/resources/static/
|
2026-04-26 20:55:41 +02:00
|
|
|
RUN --mount=type=cache,target=/root/.m2/repository ./mvnw package -DskipTests -U -B
|
2026-04-06 15:51:59 +02:00
|
|
|
|
2026-04-28 09:42:38 +02:00
|
|
|
# Runtime: Chainguard Wolfi-based JRE (glibc, daily CVE refresh, non-root by default)
|
|
|
|
|
FROM cgr.dev/chainguard/jre:openjdk-21
|
2026-03-30 10:33:01 +02:00
|
|
|
WORKDIR /app
|
2026-04-28 09:42:38 +02:00
|
|
|
USER root
|
|
|
|
|
RUN mkdir -p /data/jars && chown -R nonroot:nonroot /data
|
|
|
|
|
COPY --chown=nonroot:nonroot --from=build /build/target/*.jar app.jar
|
|
|
|
|
USER nonroot
|
2026-03-30 10:33:01 +02:00
|
|
|
EXPOSE 8080
|
2026-04-06 14:24:33 +02:00
|
|
|
ENTRYPOINT ["java", "-jar", "app.jar"]
|