34 lines
1.1 KiB
Docker
34 lines
1.1 KiB
Docker
|
|
# Stage 1: Build frontend with Node.js
|
|
FROM node:22-alpine AS frontend
|
|
WORKDIR /frontend
|
|
COPY frontend/package.json frontend/package-lock.json ./
|
|
RUN npm ci
|
|
COPY frontend/ ./
|
|
RUN npm run build -- --configuration production
|
|
|
|
# Stage 2: Build backend with Gradle
|
|
FROM eclipse-temurin:21-jdk AS builder
|
|
WORKDIR /app
|
|
COPY backend/build.gradle backend/settings.gradle ./
|
|
COPY backend/gradlew ./
|
|
COPY backend/gradle/ gradle/
|
|
COPY backend/src/ src/
|
|
# Copy built frontend assets into Spring static resources
|
|
COPY --from=frontend /frontend/dist/frontend/browser src/main/resources/static/
|
|
RUN chmod +x gradlew && SKIP_FRONTEND=true ./gradlew bootJar --no-daemon
|
|
|
|
# Stage 3: Runtime image
|
|
FROM eclipse-temurin:21-jre
|
|
WORKDIR /app
|
|
COPY --from=builder /app/build/libs/backend-0.0.1-SNAPSHOT.jar app.jar
|
|
|
|
RUN adduser --disabled-password --gecos "" appuser && \
|
|
chown appuser:appuser /app
|
|
USER appuser
|
|
|
|
EXPOSE 8080
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD wget -q --spider http://localhost:8080/api/system/metrics || exit 1
|
|
|
|
ENTRYPOINT ["java", "-jar", "app.jar"] |