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 EXPOSE 8000 CMD ["sh", "-c", "granian --interface asgi ${APP_MODULE:-src.main:app} --host ${APP_HOST:-0.0.0.0} --port ${APP_PORT:-8000} --workers ${APP_WORKERS:-1} --loop uvloop"]