# syntax=docker/dockerfile:1 # ============================================================================= # Builder stage - compile and test # ============================================================================= FROM golang:1.21 AS builder WORKDIR /build # Install dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ git \ bc \ && rm -rf /var/lib/apt/lists/* # Copy go mod files COPY go.mod ./ # Download dependencies RUN go mod download || true # Copy source code COPY . . # Run tests with coverage (fail if < 80%) RUN --mount=type=cache,target=/root/.cache/go-build \ go test -race -coverprofile=coverage.txt -covermode=atomic ./... && \ echo "=== Coverage Report ===" && \ go tool cover -func=coverage.txt | grep total && \ TOTAL=$(go tool cover -func=coverage.txt | grep total | awk '{gsub(/%/, "", $3); print $3}') && \ echo "Total coverage: ${TOTAL}%" && \ if (( $(echo "$TOTAL < 80" | bc -l) )); then \ echo "ERROR: Coverage ${TOTAL}% is below 80% threshold"; \ exit 1; \ fi && \ echo "Coverage check passed!" # Build binary RUN --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -ldflags="-w -s" \ -o /usr/bin/logcorrelator \ ./cmd/logcorrelator # Create runtime root filesystem RUN mkdir -p /tmp/runtime-root/var/log/logcorrelator /tmp/runtime-root/var/run/logcorrelator /tmp/runtime-root/etc/logcorrelator # ============================================================================= # Runtime stage - minimal image for running the service # ============================================================================= FROM scratch AS runtime # Copy binary from builder COPY --from=builder /usr/bin/logcorrelator /usr/bin/logcorrelator # Copy example config COPY --from=builder /build/config.example.yml /etc/logcorrelator/logcorrelator.yml # Create necessary directories in builder stage (scratch image has no shell) COPY --from=builder /tmp/runtime-root/var /var COPY --from=builder /tmp/runtime-root/etc /etc # Expose nothing (Unix sockets only) # Health check not applicable for this service type # Set entrypoint ENTRYPOINT ["/usr/bin/logcorrelator"] CMD ["-config", "/etc/logcorrelator/logcorrelator.yml"] # ============================================================================= # RPM build stage - create .rpm package entirely in Docker # ============================================================================= FROM ruby:3.2-bookworm AS rpm-builder WORKDIR /build # Install fpm and rpm tools RUN apt-get update && apt-get install -y --no-install-recommends \ rpm \ && rm -rf /var/lib/apt/lists/* \ && gem install fpm -v 1.16.0 # Copy binary from builder stage COPY --from=builder /usr/bin/logcorrelator /tmp/pkgroot/usr/bin/logcorrelator # Copy config and systemd unit COPY --from=builder /build/config.example.yml /tmp/pkgroot/etc/logcorrelator/logcorrelator.yml COPY logcorrelator.service /tmp/pkgroot/etc/systemd/system/logcorrelator.service # Create directory structure and set permissions RUN mkdir -p /tmp/pkgroot/var/log/logcorrelator && \ mkdir -p /tmp/pkgroot/var/run/logcorrelator && \ chmod 755 /tmp/pkgroot/var/log/logcorrelator && \ chmod 755 /tmp/pkgroot/var/run/logcorrelator # Build RPM ARG VERSION=$(grep -m1 "^Version:" packaging/rpm/logcorrelator.spec | awk '{print $2}') RUN fpm -s dir -t rpm \ -n logcorrelator \ -v ${VERSION} \ -C /tmp/pkgroot \ --prefix / \ --description "Log correlation service for HTTP and network events" \ --url "https://github.com/logcorrelator/logcorrelator" \ --license "MIT" \ --vendor "logcorrelator" \ -p /tmp/logcorrelator-${VERSION}.rpm \ usr/bin/logcorrelator \ etc/logcorrelator/logcorrelator.yml \ etc/systemd/system/logcorrelator.service \ var/log/logcorrelator \ var/run/logcorrelator # ============================================================================= # Development stage - for local testing with hot reload # ============================================================================= FROM golang:1.21 AS dev WORKDIR /app # Install air for hot reload (optional) RUN go install github.com/air-verse/air@latest COPY go.mod ./ RUN go mod download || true COPY . . # Default command: run with example config CMD ["go", "run", "./cmd/logcorrelator", "-config", "config.example.yml"]