# Build stage: only wheels, no compilers in the final image. FROM python:3.12-slim AS builder ENV PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libxml2-dev \ libxslt1-dev \ zlib1g-dev \ && rm -rf /var/lib/apt/lists/* RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Runtime stage. FROM python:3.12-slim ENV PATH="/opt/venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PLAYWRIGHT_BROWSERS_PATH=/ms-playwright \ STORAGE_DIR=/tmp/html-to-pdf # WeasyPrint needs cairo, pango and harfbuzz. The font packages cover Czech # diacritics, without them the output silently falls back to boxes. RUN apt-get update && apt-get install -y --no-install-recommends \ libcairo2 \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libpangoft2-1.0-0 \ libgdk-pixbuf-2.0-0 \ libharfbuzz0b \ libffi8 \ shared-mime-info \ fonts-dejavu \ fonts-liberation2 \ fonts-noto-core \ fonts-noto-color-emoji \ qpdf \ ca-certificates \ curl \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /opt/venv /opt/venv # Chromium plus its own system dependencies for the second render engine. RUN playwright install --with-deps chromium \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY app ./app EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD curl -fsS http://127.0.0.1:8000/health || exit 1 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]