# syntax=docker/dockerfile:1.7 # Override these in CI with immutable digests when you are ready to pin them fully. ARG GO_IMAGE=golang:1.26.2-alpine3.22 ARG RUNTIME_IMAGE=gcr.io/distroless/static-debian12:nonroot FROM ${GO_IMAGE} AS build-base WORKDIR /src ENV CGO_ENABLED=0 \ GOOS=linux \ GOFLAGS=-buildvcs=false COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ go mod download && go mod verify FROM build-base AS healthcheck-build COPY cmd/healthcheck/ ./cmd/healthcheck/ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ go build \ -trimpath \ -ldflags="-s -w" \ -o /out/healthcheck \ ./cmd/healthcheck FROM build-base AS worker-build COPY cmd/worker/ ./cmd/worker/ COPY internal/ ./internal/ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ go build \ -trimpath \ -ldflags="-s -w" \ -o /out/wucher-worker \ ./cmd/worker RUN mkdir -p /out/.local/emails && touch /out/.local/emails/.keep FROM build-base AS file-worker-build COPY cmd/worker/ ./cmd/worker/ COPY internal/ ./internal/ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ go build \ -trimpath \ -ldflags="-s -w" \ -o /out/wucher-file-worker \ ./cmd/worker FROM build-base AS api-build ARG VERSION=unknown ARG COMMIT=unknown ARG BUILD_TIME=unknown COPY cmd/api/ ./cmd/api/ COPY internal/ ./internal/ COPY docs/docs.go ./docs/docs.go RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ go build \ -trimpath \ -ldflags="-s -w -X 'wucher/internal/buildinfo.Version=${VERSION}' -X 'wucher/internal/buildinfo.Commit=${COMMIT}' -X 'wucher/internal/buildinfo.BuildTime=${BUILD_TIME}'" \ -o /out/wucher-api \ ./cmd/api FROM ${RUNTIME_IMAGE} AS runtime-base WORKDIR /app FROM runtime-base AS worker COPY --from=healthcheck-build --chown=nonroot:nonroot /out/healthcheck /app/healthcheck COPY --from=worker-build --chown=nonroot:nonroot /out/wucher-worker /app/wucher-worker COPY --from=worker-build --chown=nonroot:nonroot /out/.local/emails/ /app/.local/emails/ ENV WORKER_JOB=email USER nonroot:nonroot ENTRYPOINT ["/app/wucher-worker"] FROM runtime-base AS file-worker COPY --from=healthcheck-build --chown=nonroot:nonroot /out/healthcheck /app/healthcheck COPY --from=file-worker-build --chown=nonroot:nonroot /out/wucher-file-worker /app/wucher-file-worker ENV WORKER_JOB=file_processing USER nonroot:nonroot ENTRYPOINT ["/app/wucher-file-worker"] FROM runtime-base AS api COPY --from=healthcheck-build --chown=nonroot:nonroot /out/healthcheck /app/healthcheck COPY --from=api-build --chown=nonroot:nonroot /out/wucher-api /app/wucher-api USER nonroot:nonroot EXPOSE 8080 ENTRYPOINT ["/app/wucher-api"]