# The base arrives pinned from module.json's build.on (python 3.12.13 on alpine 3.24); the mesh # builds this image from this repository and a commit (novox/hq ADR 0069). The build context is # the repository root, so every COPY names its path from there. ARG PYTHON_BASE FROM ${PYTHON_BASE} WORKDIR /app # Runtime deps: # - cairo provides libcairo so cairosvg can rasterise SVG → PNG. # - ttf-liberation gives Liberation Sans Bold at # /usr/share/fonts/liberation/LiberationSans-Bold.ttf — exactly where Arch # installs it, so dev (shanks) and prod (this container) render with the # same font and the posters come out identical. RUN apk add --no-cache \ cairo \ ttf-liberation # All pip deps ship musllinux wheels — no build-deps needed. # numpy is pulled in by models/geo_json/geometry.py for vector ops at import time. # The versions are the ones the running deployment had (service/requirements.txt). COPY service/requirements.txt ./requirements.txt RUN pip install --no-cache-dir -r requirements.txt COPY cdn-api.py circuits_service.py ergast_service.py posters_service.py ./ COPY models/ ./models/ COPY circuits/ ./circuits/ EXPOSE 8000 CMD ["uvicorn", "cdn-api:app", "--host", "0.0.0.0", "--port", "8000"]