# Phase 2 als Container.
#
#   podman build -t wurzelwerk-p2 .
#
# Debian trixie wie der Postgres-Container - dieselbe glibc, dieselbe
# Zeichensortierung. Fuer die Module ohne Modell spielt das keine Rolle,
# fuer kuenftige Vergleiche in der Datenbank schon.
FROM docker.io/library/python:3.13-slim-trixie

# OMP_NUM_THREADS ist keine Bequemlichkeit, sondern Voraussetzung:
#   - PyTorch liest die CPU-Zahl am Host ab, nicht die cgroup-Quota. Ohne
#     feste Zahl startet es im Container mehr Threads als es Kontingent hat.
#   - Die Threadzahl bestimmt die Reihenfolge der Gleitkommaadditionen und
#     damit die letzten Stellen jedes Vektors. Sie gehoert deshalb in die
#     coder_version (siehe embeddings.py).
# 4 laeuft auf jeder Maschine, die hier in Frage kommt - Prod hat 16 Threads,
# die Entwicklungsmaschine 32.
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    HF_HOME=/cache/huggingface \
    OMP_NUM_THREADS=4 \
    MKL_NUM_THREADS=4 \
    TOKENIZERS_PARALLELISM=false

WORKDIR /app

# torch zuerst und in einer eigenen Schicht: 196 MB, die sich nicht aendern,
# wenn eine Anforderungsdatei angefasst wird. Ausdruecklich aus dem CPU-Index -
# die Vorgabe von PyPI zoege mehrere Gigabyte CUDA-Bibliotheken nach, die auf
# diesem Server nichts ausrichten koennen (der SM750 ist ein Anzeigechip).
RUN python3 -m pip install --no-cache-dir --upgrade pip \
 && python3 -m pip install --no-cache-dir \
        --index-url https://download.pytorch.org/whl/cpu torch==2.14.0+cpu

COPY requirements.txt requirements-embedding.txt requirements-akteure.txt ./
RUN python3 -m pip install --no-cache-dir -r requirements.txt \
 && python3 -m pip install --no-cache-dir -r requirements-embedding.txt \
 && python3 -m pip install --no-cache-dir -r requirements-akteure.txt

# Das NER-Modell mit fester Version, direkt aus der Modellfreigabe. Es liegt
# im Abbild und nicht im Cache-Volume: 568 MB, die sich nie aendern, und der
# erste Lauf auf Prod soll nicht an einem Download haengen.
RUN python3 -m pip install --no-cache-dir \
        https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.8.0/de_core_news_lg-3.8.0-py3-none-any.whl \
 && python3 -m pip freeze > /app/requirements-lock.txt

COPY *.py ./
COPY migrations/ ./migrations/
# Der Wikidata-Spiegel gehoert ins Abbild: akteure.py laedt aus der
# Datenbank, aber lexikon_laden.py soll im Container laufen koennen, ohne
# dass jemand dafuer Wikidata anfasst.
COPY lexikon/ ./lexikon/

# Eigener Benutzer, kein root. /cache traegt die Modellgewichte und muss ein
# Volume sein - 2,2 GB im Container-Layer waeren bei jedem Neubau weg.
RUN useradd --uid 10001 --create-home wurzelwerk \
 && mkdir -p /cache/huggingface \
 && chown -R 10001:10001 /cache /app
USER 10001

ENTRYPOINT ["python3"]
CMD ["check_db.py"]
