FROM python:3.11-slim AS builder RUN apt-get update -qq && apt-get install -y -qq --no-install-recommends \ build-essential \ poppler-utils \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY scripts/ scripts/ RUN python scripts/download_model.py || echo "WARNING: model pre-cache failed (will lazy-load at runtime)" FROM python:3.11-slim RUN apt-get update -qq && apt-get install -y -qq --no-install-recommends \ poppler-utils \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin COPY --from=builder /app/models models/ # Pre-downloaded HF cache for reranker (avoids runtime download) ENV HF_HOME=/app/models/hf_cache \ HF_HUB_CACHE=/app/models/hf_cache/hub COPY alembic.ini ./ COPY alembic ./alembic COPY src/ src/ ENV PYTHONPATH=/app \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PORT=7860 EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:7860/health')" || exit 1 CMD alembic upgrade head || echo "alembic skipped (in-memory fallback)"; \ exec uvicorn src.api.main:app \ --host 0.0.0.0 \ --port 7860 \ --workers 1 \ --loop asyncio \ --http httptools \ --no-access-log