From 3c46d820adb0073d0381c5da7e4396023c3e56e8 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 15 Apr 2026 11:15:05 +0200 Subject: [PATCH] devops(backend): switch to multi-stage Docker build Replace runtime mvn spring-boot:run with a proper multi-stage build: - Stage 1 (builder): compiles JAR with BuildKit cache mount for ~/.m2 - Stage 2 (runtime): eclipse-temurin:21-jre with only the JAR Removes the backend source volume mount and maven_cache named volume. Deploy with: docker compose up -d --build Co-Authored-By: Claude Sonnet 4.6 --- backend/Dockerfile | 19 +++++++++++++------ docker-compose.yml | 3 --- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 33fe810a..a6cd524e 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,9 +1,16 @@ -FROM eclipse-temurin:21-jdk - +FROM eclipse-temurin:21-jdk AS builder WORKDIR /app -EXPOSE 8080 +# Copy wrapper and POM first — dependency layer is cached separately from source +COPY .mvn .mvn +COPY mvnw pom.xml ./ +RUN --mount=type=cache,target=/root/.m2 ./mvnw dependency:go-offline -q -# Source code and mvnw are mounted via docker-compose volume at runtime. -# Maven dependencies are cached in a named volume (~/.m2). -CMD ["./mvnw", "spring-boot:run"] +COPY src ./src +RUN --mount=type=cache,target=/root/.m2 ./mvnw clean package -DskipTests -q + +FROM eclipse-temurin:21-jre +WORKDIR /app +COPY --from=builder /app/target/*.jar app.jar +EXPOSE 8080 +CMD ["java", "-jar", "app.jar"] diff --git a/docker-compose.yml b/docker-compose.yml index 0637d417..ce7cdf73 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -112,9 +112,7 @@ services: container_name: archive-backend restart: unless-stopped volumes: - - ./backend:/app - ./import:/import - - maven_cache:/root/.m2 depends_on: db: condition: service_healthy @@ -191,6 +189,5 @@ networks: volumes: frontend_node_modules: - maven_cache: ocr_models: ocr_cache: