# syntax=docker/dockerfile:1 # ─── Stage 1: Build Go binaries ─────────────────────────────────────────────── FROM golang:1.23-alpine AS builder ARG TARGETOS ARG TARGETARCH RUN apk --no-cache add ca-certificates git build-base WORKDIR /app COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY . . ARG SERVICE=tenant-api RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=1 GOOS="${TARGETOS:-$(go env GOOS)}" GOARCH="${TARGETARCH:-$(go env GOARCH)}" \ go build -trimpath -ldflags="-s -w" \ -o /bin/service ./cmd/${SERVICE} # ─── Stage 2: Migration image (bundles SQL files + migrate binary) ───────────── FROM migrate/migrate:v4.19.1 AS migrate-tool FROM alpine:3.19 AS migrate RUN apk --no-cache add ca-certificates COPY --from=migrate-tool /usr/local/bin/migrate /usr/local/bin/migrate COPY migrations/ /migrations/ COPY migrations_monitoring/ /migrations_monitoring/ COPY migrations_ops/ /migrations_ops/ ENTRYPOINT ["/usr/local/bin/migrate"] # ─── Stage 3: Runtime image ──────────────────────────────────────────────────── FROM alpine:3.19 AS runtime RUN apk --no-cache add ca-certificates tzdata WORKDIR /app COPY --from=builder /bin/service /app/service COPY configs/ /app/configs/ EXPOSE 8080 8081 ENTRYPOINT ["/app/service"]