# ── Stage 1: build ─────────────────────────────────────────────────────────── # Compiles native extensions (ckzg, asyncpg, cryptography) so the final image # only carries the compiled .so files, not the build toolchain. FROM python:3.11-slim AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ gcc build-essential cmake libpq-dev libffi-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /build RUN pip install --no-cache-dir --upgrade pip wheel setuptools COPY requirements.txt . RUN pip install --no-cache-dir --prefix=/install -r requirements.txt # ── Stage 2: runtime ───────────────────────────────────────────────────────── FROM python:3.11-slim # Only runtime shared libs needed (libpq for asyncpg, libgomp for numpy if used) RUN apt-get update && apt-get install -y --no-install-recommends \ libpq5 curl \ && rm -rf /var/lib/apt/lists/* # Copy compiled packages from builder COPY --from=builder /install /usr/local WORKDIR /app COPY . . RUN chmod +x entrypoint.sh # Non-root user RUN useradd -m appuser && chown -R appuser /app USER appuser EXPOSE 8000 ENTRYPOINT ["./entrypoint.sh"]