diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 00000000..3ddbd536 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,4 @@ +target/ +.git/ +*.md +api_tests/ diff --git a/backend/Dockerfile b/backend/Dockerfile index 33fe810a..3f2c02a5 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,9 +1,18 @@ -FROM eclipse-temurin:21-jdk - +FROM eclipse-temurin:21.0.10_7-jdk-noble 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 +# -Dmaven.test.skip=true skips test compilation entirely (not just execution) +RUN --mount=type=cache,target=/root/.m2 ./mvnw clean package -Dmaven.test.skip=true -q + +FROM eclipse-temurin:21.0.10_7-jre-noble +WORKDIR /app +# Spring Boot repackages to *.jar; pre-repackage artifact uses .jar.original, not .jar +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..1a55f04d 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 @@ -155,7 +153,7 @@ services: interval: 15s timeout: 5s retries: 10 - start_period: 60s + start_period: 30s # JAR starts in ~15s; was 60s when compilation happened at startup # --- Frontend: SvelteKit (Dev Server) --- frontend: @@ -191,6 +189,5 @@ networks: volumes: frontend_node_modules: - maven_cache: ocr_models: ocr_cache: