# syntax=docker/dockerfile:1.7 # ---------- build ---------- FROM golang:1.23-alpine3.21 AS build ENV CGO_ENABLED=0 \ GOOS=linux \ GOFLAGS="-trimpath" WORKDIR /src # Pre-cache module metadata before copying sources. approval-service is # currently stdlib-only (no go.sum), but `go mod download` on a sum-less # module is a no-op and keeps the layer stable if a go.sum is added later. COPY services/approval-service/go.mod ./services/approval-service/ RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg/mod \ cd services/approval-service && go mod download COPY services/approval-service/ ./services/approval-service/ WORKDIR /src/services/approval-service RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg/mod \ go vet ./... && \ go test ./... && \ go build -ldflags="-s -w" -o /out/approval-service ./cmd/approval-service # ---------- runtime ---------- # Distroless static+nonroot: no shell, no package manager, UID/GID 65532. FROM gcr.io/distroless/static-debian12:nonroot COPY --from=build /out/approval-service /approval-service USER 65532:65532 EXPOSE 8080 ENTRYPOINT ["/approval-service"] CMD ["-listen=:8080"]