Files
swyxweb/Dockerfile
T
SvenandClaude Opus 5 2a2bce860e Deployment als Docker-Container
Ein Container liefert Startseite und REST-API über Port 8080 aus: Das
Dockerfile baut das Frontend mit Node, legt das Ergebnis in die statischen
Ressourcen des Backends und packt beides mit Maven zum Jar; die Laufzeit-
stufe enthält nur ein JRE und das Jar, ausgeführt als Benutzer swyx.

Die beiden Build-Stufen laufen auf $BUILDPLATFORM, also nativ auf dem
bauenden Rechner - JS-Bundle und Jar sind architekturunabhängig. Nur das
Laufzeit-Image wird für die Zielarchitektur gezogen, was beim Bauen für
linux/amd64 auf einem ARM-Mac die Emulation spart.

docker_push.sh liest die Version aus backend/pom.xml, baut für linux/amd64
und pusht in die Registry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 14:17:44 +02:00

77 lines
3.1 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1
# SwyxWeb als ein Container: Das React-Frontend wird gebaut, in die statischen
# Ressourcen des Backends gelegt und zusammen mit ihm in ein Jar gepackt.
# Ausgeliefert wird am Ende alles über den einen Port des Backends (8080).
#
# Der eingebaute SwyxTray-Mock (/ws und /api/mock/**) läuft NICHT mit: seine
# Bohnen hängen am Spring-Profil "mock", und das setzt dieses Image nicht.
#
# Die beiden Build-Stufen laufen bewusst auf $BUILDPLATFORM, also nativ auf dem
# bauenden Rechner: JS-Bundle und Jar sind architekturunabhängig. Nur die
# Laufzeitstufe wird für die Zielarchitektur gezogen. Ein Build mit
# --platform linux/amd64 auf einem ARM-Mac läuft dadurch ohne Emulation.
# ---------------------------------------------------------------------------
# 1. Frontend bauen (Vite -> frontend/dist)
# ---------------------------------------------------------------------------
FROM --platform=$BUILDPLATFORM node:22-alpine AS frontend
WORKDIR /build
# Erst die Abhängigkeiten, damit diese Schicht im Cache bleibt, solange sich
# package.json/package-lock.json nicht ändern.
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
COPY frontend/ ./
# VITE_WS_URL nur setzen, wenn die Adresse fest ins Bundle soll; im Normalfall
# kommt sie zur Laufzeit aus /api/config (siehe README).
ARG VITE_WS_URL
RUN npm run build
# ---------------------------------------------------------------------------
# 2. Backend bauen (Spring Boot 4.1, Java 21) inkl. Frontend als static/
# ---------------------------------------------------------------------------
FROM --platform=$BUILDPLATFORM maven:3.9-eclipse-temurin-21 AS backend
WORKDIR /build
# Abhängigkeiten vorab auflösen eigene Schicht, unabhängig vom Quelltext.
COPY backend/pom.xml ./
RUN --mount=type=cache,target=/root/.m2 \
mvn -B -q dependency:go-offline
COPY backend/src ./src
COPY --from=frontend /build/dist/ ./src/main/resources/static/
RUN --mount=type=cache,target=/root/.m2 \
mvn -B -DskipTests clean package \
&& cp target/*.jar /build/app.jar
# ---------------------------------------------------------------------------
# 3. Laufzeit-Image
# ---------------------------------------------------------------------------
FROM eclipse-temurin:21-jre-alpine AS runtime
# Nicht als root laufen.
RUN addgroup -S swyx && adduser -S -G swyx swyx
WORKDIR /app
COPY --from=backend --chown=swyx:swyx /build/app.jar ./app.jar
USER swyx
EXPOSE 8080
# Adresse der SwyxTray-App zur Laufzeit überschreibbar (Spring Relaxed Binding):
# -e APP_WEBSOCKET_HOST=192.168.180.135 -e APP_WEBSOCKET_PORT=17654
# -e APP_WEBSOCKET_PATH=/ws -e APP_WEBSOCKET_SECURE=false
#
# SPRING_PROFILES_ACTIVE bleibt bewusst leer der SwyxTray-Mock bliebe sonst
# beim Ausrollen erreichbar. Für eine Vorführung ohne Telefonanlage lässt er
# sich einzeln einschalten: -e SPRING_PROFILES_ACTIVE=mock
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0"
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD wget -q -O /dev/null http://127.0.0.1:8080/api/config || exit 1
ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"]