FROM maven:3.9-eclipse-temurin-21 AS builder
# Set working directory
WORKDIR /build
# Copy project files
COPY pom.xml .
COPY src ./src
# Build the application
RUN mvn clean package -DskipTests
# Runtime stage
FROM eclipse-temurin:21-jre-jammy
# Metadata
LABEL maintainer="Cube Database Team"
LABEL description="Cube Database - Cassandra-like distributed database"
LABEL version="1.0.0"
# Create application user
RUN groupadd -r cubedb && useradd -r -g cubedb cubedb
# Set working directory
WORKDIR /opt/cube-db
# Copy built JAR from builder stage
COPY --from=builder /build/target/cube-db-1.0.0.jar ./cube-db.jar
# Copy scripts
COPY start.sh ./
COPY run-shell.sh ./
RUN chmod +x *.sh
# Create directories for data and hints
RUN mkdir -p /var/lib/cube/data /var/lib/cube/hints /var/log/cube && \
chown -R cubedb:cubedb /var/lib/cube /var/log/cube /opt/cube-db
# Switch to non-root user
USER cubedb
# Environment variables with defaults
ENV CUBE_NODE_ID=node-1
ENV CUBE_HOST=0.0.0.0
ENV CUBE_PORT=8080
ENV CUBE_DATA_DIR=/var/lib/cube/data
ENV CUBE_HINTS_DIR=/var/lib/cube/hints
ENV JAVA_OPTS="-Xmx1G -Xms512M"
# Expose ports
EXPOSE 8080
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/api/v1/health || exit 1
# Volume for persistent data
VOLUME ["/var/lib/cube/data", "/var/lib/cube/hints"]
# Default command - start the database server
CMD java ${JAVA_OPTS} \
-Dcube.nodeid=${CUBE_NODE_ID} \
-Dcube.host=${CUBE_HOST} \
-Dserver.port=${CUBE_PORT} \
-Dcube.datadir=${CUBE_DATA_DIR} \
-Dcube.hints.dir=${CUBE_HINTS_DIR} \
-jar cube-db.jar