65 lines
No EOL
1.4 KiB
Docker
65 lines
No EOL
1.4 KiB
Docker
# Multi-stage Dockerfile for Serena (Backend + Frontend)
|
|
|
|
# Stage 1: Build Frontend
|
|
FROM node:18-alpine AS frontend-builder
|
|
|
|
WORKDIR /app/frontend
|
|
|
|
# Copy package files
|
|
COPY frontend/package*.json ./
|
|
|
|
# Install dependencies
|
|
RUN npm ci --only=production
|
|
|
|
# Copy frontend source
|
|
COPY frontend/ ./
|
|
|
|
# Build frontend
|
|
RUN npm run build
|
|
|
|
# Stage 2: Build Backend
|
|
FROM openjdk:21-jdk-slim AS backend-builder
|
|
|
|
WORKDIR /app/backend
|
|
|
|
# Copy Gradle wrapper and build files
|
|
COPY backend/gradlew ./
|
|
COPY backend/gradle/ ./gradle/
|
|
COPY backend/build.gradle ./
|
|
COPY backend/settings.gradle ./
|
|
|
|
# Copy source code
|
|
COPY backend/src/ ./src/
|
|
|
|
# Make gradlew executable and build
|
|
RUN chmod +x gradlew
|
|
RUN ./gradlew build --no-daemon -x test
|
|
|
|
# Stage 3: Runtime
|
|
FROM openjdk:21-jre-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# Install curl for health checks
|
|
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
|
|
|
|
# Copy built backend JAR
|
|
COPY --from=backend-builder /app/backend/build/libs/*.jar app.jar
|
|
|
|
# Copy built frontend (will be served by Spring Boot)
|
|
COPY --from=frontend-builder /app/frontend/build/ /app/static/
|
|
|
|
# Create non-root user
|
|
RUN groupadd -r serena && useradd -r -g serena serena
|
|
RUN chown -R serena:serena /app
|
|
USER serena
|
|
|
|
# Expose port
|
|
EXPOSE 8080
|
|
|
|
# Health check
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
|
CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
|
|
# Run the application
|
|
ENTRYPOINT ["java", "-jar", "app.jar"] |