# Stage 1: Build server binary FROM golang:1.24-alpine AS server-builder WORKDIR /app # Install git for module resolution RUN apk add --no-cache git # Copy go.mod and go.sum COPY aggregator-server/go.mod aggregator-server/go.sum ./ RUN go mod download COPY aggregator-server/ ./ RUN CGO_ENABLED=0 go build -o redflag-server cmd/server/main.go # Stage 2: Build agent binaries for all platforms FROM golang:1.24-alpine AS agent-builder WORKDIR /build # Install git for version detection RUN apk add --no-cache git # Copy .git directory to get version info COPY .git/ ./.git/ # Generate semantic version from git (BASE_VERSION.COMMIT_COUNT) # Examples: # Tagged release: v0.1.26.0 → 0.1.26.0 # 5 commits after tag: 0.1.26.5 # No tags: 0.1.0.0 RUN cd /build && \ # Get latest tag or default to 0.1.0 \ if git describe --tags --dirty --always >/dev/null 2>&1; then \ LATEST_TAG=$(git describe --tags --dirty --always); \ BASE_VERSION=$(echo "$LATEST_TAG" | sed 's/^v//' | cut -d. -f1-3); \ else \ BASE_VERSION="0.1.0"; \ fi && \ # Count commits since tag (0 if on tag) \ COMMITS_SINCE=$(git rev-list $(git describe --tags --dirty --always 2>/dev/null)..HEAD 2>/dev/null | wc -l | tr -d ' ') && \ if [ "$COMMITS_SINCE" = "" ] || [ "$COMMITS_SINCE" -eq 0 ]; then BUILD=0; else BUILD=$COMMITS_SINCE; fi && \ # Write semantic version (base.commits) \ VERSION="${BASE_VERSION}.${BUILD}" && \ echo "Building agent version: $VERSION" && \ echo "$VERSION" > /build/version.txt # Copy agent source code COPY aggregator-agent/ ./ # Build for Linux amd64 RUN VERSION=$(cat /build/version.txt) && \ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -ldflags "-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.Version=$VERSION" \ -o binaries/linux-amd64/redflag-agent ./cmd/agent # Build for Linux arm64 RUN VERSION=$(cat /build/version.txt) && \ CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \ -ldflags "-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.Version=$VERSION" \ -o binaries/linux-arm64/redflag-agent ./cmd/agent # Build for Windows amd64 RUN VERSION=$(cat /build/version.txt) && \ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build \ -ldflags "-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.Version=$VERSION" \ -o binaries/windows-amd64/redflag-agent.exe ./cmd/agent # Build for Windows arm64 RUN VERSION=$(cat /build/version.txt) && \ CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build \ -ldflags "-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.Version=$VERSION" \ -o binaries/windows-arm64/redflag-agent.exe ./cmd/agent # Stage 3: Final image with server and all agent binaries FROM alpine:latest RUN apk --no-cache add ca-certificates tzdata bash WORKDIR /app # Copy server binary COPY --from=server-builder /app/redflag-server . COPY --from=server-builder /app/internal/database ./internal/database # Copy all agent binaries COPY --from=agent-builder /build/binaries ./binaries # Copy and setup entrypoint script COPY aggregator-server/docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh EXPOSE 8080 ENTRYPOINT ["docker-entrypoint.sh"] CMD ["./redflag-server"]