FROM python:3.13-slim AS builder # Prevent Python from writing .pyc files and enable unbuffered stdout/stderr ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 WORKDIR /app # Install build deps required to build wheels and tools needed to fetch uv RUN apt-get update \ && apt-get install -y --no-install-recommends build-essential gcc curl ca-certificates \ && rm -rf /var/lib/apt/lists/* # Install uv into this stage by copying official uv binaries from the uv image COPY --from=ghcr.io/astral-sh/uv:python3.13-trixie-slim /uv /uvx /bin/ # Copy only metadata first so dependency installs can be cached COPY pyproject.toml ./ # Use uv to resolve & install the project's dependencies (no project source yet) # This creates a .venv containing all dependencies which we move to /install RUN uv sync --no-install-project --no-editable \ && mv .venv /install # Copy application source (only used to include app files in final image) COPY . /app FROM python:3.13-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ API_PORT=8001 WORKDIR /app # Bring uv into the final image so we can run the app with it COPY --from=ghcr.io/astral-sh/uv:python3.13-trixie-slim /uv /uvx /bin/ # Copy the prepared environment from the builder and the application COPY --from=builder /install /app/.venv COPY --from=builder /app /app ENV PATH="/app/.venv/bin:$PATH" EXPOSE ${API_PORT} # Use uv to run the app inside the synced environment CMD ["uv", "run", "python", "api_service.py"]