FROM python:3.12-slim WORKDIR /app # Install uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv # Install dependencies first (cached layer — only invalidates when pyproject.toml changes) COPY pyproject.toml . RUN uv pip install --system --no-cache fastapi uvicorn[standard] sqlmodel apscheduler \ cryptography httpx jinja2 python-multipart prometheus-client aiofiles # Copy application code COPY app/ ./app/ # Install the package itself (editable-free, no pip install of the whole project) RUN uv pip install --system --no-cache --no-deps . ARG APP_VERSION=dev LABEL org.opencontainers.image.version="${APP_VERSION}" VOLUME ["/data"] EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/healthz')" || exit 1 CMD ["python", "-m", "app.main"]