# syntax=docker/dockerfile:1 FROM python:3.12-slim AS base ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ ML_MODEL_DIR=/models # System deps: Pillow / image handling + psycopg2 build deps (binary wheel usually fine but libpq is needed at runtime on slim) RUN apt-get update && apt-get install -y --no-install-recommends \ libgl1 \ libglib2.0-0 \ libpq5 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Install PyTorch CPU wheel first from its dedicated index to avoid pulling CUDA libs. # Floor only — buildkit will pick the latest matching CPU wheel; keep this above the app-deps # layer so transformers on PyPI doesn't accidentally resolve a mismatched torch. RUN pip install --no-cache-dir \ --index-url https://download.pytorch.org/whl/cpu \ "torch>=2.5" # Pre-install only what the model downloader needs, then fetch models. By keeping the model-download # layer above the full requirements install, a change to requirements-ml.txt won't invalidate the # (slow, ~2 GB) model download layer. RUN pip install --no-cache-dir "huggingface_hub>=0.25" COPY scripts/download_models.py /app/scripts/download_models.py RUN mkdir -p ${ML_MODEL_DIR} && python /app/scripts/download_models.py # Install the rest of the ML requirements. Model files are already on disk from the step above. COPY requirements-ml.txt /app/requirements-ml.txt RUN pip install --no-cache-dir -r requirements-ml.txt # Copy application code (needed so Celery can import app.tasks.ml and app.ml). # config.py lives at the repo root and is imported by app/__init__.py via 'config.Config'. COPY app /app/app COPY config.py /app/config.py # Celery needs these env vars set at runtime via docker-compose. CMD ["celery", "-A", "app.celery_app:celery", "worker", "--loglevel=info", "-Q", "ml", "--concurrency=1"]