FROM ghcr.io/astral-sh/uv:python3.12-bookworm AS builder WORKDIR /app # Install dependencies (cached layer) COPY pyproject.toml uv.lock ./ RUN uv sync --frozen --no-dev # Copy source last (fast rebuilds) COPY src ./src FROM ghcr.io/astral-sh/uv:python3.12-bookworm AS runtime WORKDIR /app # Use the virtualenv created by `uv sync` in builder COPY --from=builder /app/.venv /app/.venv COPY --from=builder /app/src /app/src ENV PATH="/app/.venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONPATH=/app \ PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc EXPOSE 8000 CMD mkdir -p "$PROMETHEUS_MULTIPROC_DIR" && rm -f "$PROMETHEUS_MULTIPROC_DIR"/* && exec granian --interface asgi ${APP_MODULE:-src.main:app} --host ${APP_HOST:-0.0.0.0} --port ${APP_PORT:-8000} --workers ${APP_WORKERS:-2} --loop uvloop