| # CineMatch backend — self-contained image (models + index baked in for fast cold starts). | |
| # Tuned for Hugging Face Spaces (non-root user, listens on 7860) and also works on | |
| # Render / Railway / Fly.io (they inject $PORT). | |
| FROM python:3.11-slim | |
| # Hugging Face Spaces runs containers as UID 1000; create that user. | |
| RUN useradd -m -u 1000 user | |
| # System build deps (as root, before dropping privileges). | |
| RUN apt-get update \ | |
| && apt-get install -y --no-install-recommends build-essential \ | |
| && rm -rf /var/lib/apt/lists/* | |
| USER user | |
| ENV PYTHONUNBUFFERED=1 \ | |
| HF_HOME=/home/user/.cache/huggingface \ | |
| HF_HUB_DISABLE_TELEMETRY=1 \ | |
| PATH="/home/user/.local/bin:$PATH" | |
| WORKDIR /home/user/app | |
| COPY --chown=user requirements.txt . | |
| RUN pip install --no-cache-dir --upgrade -r requirements.txt | |
| COPY --chown=user . . | |
| # Build the corpus + index at image-build time so the container starts fast and never | |
| # downloads anything at request time. (movies_dataframe.json is optional enrichment; | |
| # build_corpus skips it gracefully if it isn't present.) | |
| RUN python -c "import nltk;[nltk.download(p) for p in ['stopwords','wordnet','omw-1.4']]" \ | |
| && python scripts/build_corpus.py \ | |
| && python scripts/build_index.py | |
| EXPOSE 7860 | |
| CMD uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-7860} | |