File size: 2,846 Bytes
fca5ceb
 
 
c7e27e5
 
 
 
 
 
60b8d69
fca5ceb
 
 
 
 
 
6d6c2e6
fca5ceb
 
60b8d69
fca5ceb
a4e83c4
fca5ceb
60b8d69
fca5ceb
60b8d69
fca5ceb
60b8d69
 
 
 
fca5ceb
04a1131
 
 
 
fca5ceb
04a1131
 
 
fca5ceb
 
 
 
c00e850
fca5ceb
c0a7163
 
60b8d69
c7e27e5
14f78a8
 
 
 
a4e83c4
c7e27e5
 
0db04e6
c00e850
fca5ceb
 
60b8d69
fca5ceb
c7e27e5
 
 
 
 
 
 
c0a7163
fca5ceb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# NeuroBridge Enterprise — Hugging Face Spaces deployment image
# Single container running FastAPI (port 8000) + Streamlit (port 7860).
# HF Spaces routes :7860 to the public URL automatically.
#
# Build philosophy: install deps + copy code + seed lightweight stub
# artifacts. Heavy pipeline runs (BBB train, EEG/MRI feature extraction,
# RAG ingest) live in docker-entrypoint.sh so they happen on first
# container start — the build can't fail because of pipeline logic, and
# the runtime is idempotent (no re-train if artifacts are present).

FROM python:3.12-slim AS base

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    PIP_NO_CACHE_DIR=1 \
    DEPLOY_ENV=hf_spaces

# --- system deps for RDKit, nibabel, MNE ---
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    git \
    libgomp1 \
    libxrender1 \
    libsm6 \
    libxext6 \
    supervisor \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# --- Python deps ---
# Install CPU-only torch first to avoid pulling ~2GB of NVIDIA CUDA wheels
# (cublas/cudnn/nccl/...) that we never use on a CPU-only HF Space and which
# blow past the build-time disk budget. Subsequent pip install -r sees torch
# already at the pinned version and skips it.
COPY requirements.txt ./
RUN pip install --index-url https://download.pytorch.org/whl/cpu \
        torch==2.4.1 torchvision==0.19.1 \
    && pip install -r requirements.txt

# --- project source ---
COPY src/ ./src/
COPY tests/fixtures/ ./tests/fixtures/
COPY scripts/ ./scripts/
COPY supervisord.conf ./supervisord.conf
COPY docker-entrypoint.sh ./docker-entrypoint.sh
RUN chmod +x /app/docker-entrypoint.sh

# --- Demo-time stub artifacts (MRI 2D / MRI volumetric ONNX / EEG joblib /
#     clinical TF-IDF RAG / axial PNG fixture). Idempotent. Wrapped in
#     `|| true` so a build-time failure here doesn't kill the image — the
#     entrypoint re-runs the same script at container start.
RUN python scripts/seed_demo_artifacts.py || echo "WARN: seed_demo_artifacts failed at build, entrypoint will retry"

# Seed kb_sample docs into the knowledge_base directory; entrypoint will
# build the FAISS index from these on first start.
COPY tests/fixtures/kb_sample/ ./data/knowledge_base/seed/

# --- HF Spaces convention ---
EXPOSE 7860

# --- launch FastAPI + Streamlit under supervisord ---
# docker-entrypoint.sh handles all the heavy lifting on first start:
# - copy raw fixtures into data/raw if missing
# - run BBB pipeline + train BBB classifier if artifacts missing
# - run EEG pipeline if features parquet missing
# - run MRI pipeline if features parquet missing
# - build FAISS index if missing
# - re-seed demo stub artifacts if missing
ENTRYPOINT ["/app/docker-entrypoint.sh"]
CMD ["supervisord", "-n", "-c", "/app/supervisord.conf"]