# Multi-stage build for the R2 load harness. Mirrors backend/Dockerfile: a # golang-alpine builder yields a static binary on distroless nonroot, with the # dictionary DAWGs baked in from the scrabble-dictionary release (the harness runs # the same solver as the backend, so it needs the same dictionary). The published # scrabble-solver module is fetched from Gitea (GOPRIVATE), so the build stage needs # git and network. # # The harness is not a contour service; build and run it ad hoc, from the repo root # so go.work, pkg/, gateway/ and loadtest/ are in the Docker context: # docker build -f loadtest/Dockerfile -t scrabble-loadtest . # docker run --rm --network scrabble-internal -e POSTGRES_PASSWORD=... scrabble-loadtest run # --- dictionary artifact ----------------------------------------------------- FROM alpine:3.20 AS dawg ARG DICT_VERSION=v1.0.0 RUN apk add --no-cache curl tar RUN mkdir -p /dawg \ && curl -fsSL -o /tmp/dawg.tar.gz \ "https://gitea.iliadenisov.ru/developer/scrabble-dictionary/releases/download/${DICT_VERSION}/scrabble-dawg-${DICT_VERSION}.tar.gz" \ && tar xzf /tmp/dawg.tar.gz -C /dawg # --- build ------------------------------------------------------------------- FROM golang:1.26.3-alpine AS build WORKDIR /src # git: the published solver module is fetched from Gitea directly (GOPRIVATE). RUN apk add --no-cache git ENV GOPRIVATE=gitea.iliadenisov.ru/* COPY go.work go.work.sum ./ COPY pkg ./pkg COPY gateway ./gateway COPY loadtest ./loadtest # Reduce the workspace to what the harness needs: loadtest + gateway (edge proto) + pkg. RUN go work edit -dropuse=./backend -dropuse=./platform/telegram RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -o /out/loadtest ./loadtest/cmd/loadtest # --- runtime ----------------------------------------------------------------- FROM gcr.io/distroless/static-debian12:nonroot COPY --from=build /out/loadtest /usr/local/bin/loadtest COPY --from=dawg /dawg /opt/dawg ENV LOADTEST_DAWG_DIR=/opt/dawg ENTRYPOINT ["/usr/local/bin/loadtest"]