FROM crystallang/crystal:1.9.2-alpine AS builder # Install build dependencies RUN apk add --no-cache \ yaml-dev \ openssl-dev \ zlib-dev \ sqlite-dev \ postgresql-dev \ git \ curl # Set build arguments ARG APP_NAME=metrics-service ARG BINARY_PATH=src/metrics_manager.cr WORKDIR /app # Copy shard files COPY shard.yml shard.lock ./ # Install dependencies RUN shards install --production # Copy source code COPY . . # Build the binary RUN crystal build --release --static ${BINARY_PATH} -o ${APP_NAME} # Runtime stage FROM alpine:3.19 # Install runtime dependencies RUN apk add --no-cache \ ca-certificates \ tzdata \ openssl \ yaml WORKDIR /app # Copy the binary from builder COPY --from=builder /app/${APP_NAME} . # Create data directory for metrics and set permissions RUN mkdir -p /data && \ adduser -D appuser && \ chown -R appuser:appuser /app /data && \ chmod 500 /app/${APP_NAME} && \ chmod -R 400 /app && \ chmod 700 /data USER appuser # Set environment variables ENV PORT=3000 ENV METRICS_PORT=9090 ENV KEMAL_ENV=production # Volume for metrics data VOLUME ["/data"] # Expose ports EXPOSE 3000 9090 ENTRYPOINT ["/app/metrics-service"]