# Multi-stage build for Java 24 FROM openjdk:24-jdk-slim AS builder # Install required packages RUN apt-get update && apt-get install -y \ curl \ unzip \ && rm -rf /var/lib/apt/lists/* # Set working directory WORKDIR /app # Copy gradle wrapper and build files COPY gradle/ gradle/ COPY gradlew . COPY gradle.properties . COPY settings.gradle.kts . COPY build.gradle.kts . # Make gradlew executable RUN chmod +x gradlew # Download dependencies (for better caching) RUN ./gradlew dependencies --no-daemon # Copy source code COPY src/ src/ # Build the application RUN ./gradlew shadowJar --no-daemon # Runtime stage FROM openjdk:24-jdk-slim # Install required runtime packages RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* # Create app user RUN groupadd -r ccoin && useradd -r -g ccoin ccoin # Set working directory WORKDIR /app # Copy the built JAR from builder stage COPY --from=builder /app/build/libs/*.jar app.jar # Change ownership to app user RUN chown -R ccoin:ccoin /app # Switch to app user USER ccoin # Expose port EXPOSE 8080 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1 # JVM options for production ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:+UseStringDeduplication" # Run the application CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]