File size: 2,568 Bytes
52235b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# syntax=docker/dockerfile:1

# CL-EPIDTN recommender model API (improved_8) — CPU-only FastAPI/Uvicorn image.
FROM python:3.11-slim

# --- Environment ---------------------------------------------------------
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    PORT=7749 \
    ARTIFACTS_DIR=artifacts_improved8 \
    # Bake the Hugging Face cache into the image so the text encoder used by
    # /catalog/add is available offline and without a runtime download.
    HF_HOME=/app/hf_cache

WORKDIR /app

# --- System dependencies -------------------------------------------------
# build-essential covers any package without a prebuilt wheel; curl powers the healthcheck.
RUN apt-get update \
    && apt-get install -y --no-install-recommends build-essential curl \
    && rm -rf /var/lib/apt/lists/*

# --- Python dependencies -------------------------------------------------
# CPU-only torch first (the GPU build is huge and unnecessary for serving),
# then the rest of the dependencies from PyPI.
RUN pip install --index-url https://download.pytorch.org/whl/cpu torch==2.6.0

COPY requirements.docker.txt ./
RUN pip install -r requirements.docker.txt

# Pre-download the text encoder used for catalog hot-add so the container does
# not need to fetch it from Hugging Face at runtime.
RUN python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')"

# --- Model artifacts -----------------------------------------------------
# The ~1.2 GB artifacts exceed the Space repo storage limit, so they are NOT
# bundled. Pull them from the public model repo at build time instead. This
# layer is placed before COPY so code changes don't re-trigger the download.
ENV MODEL_REPO=zeyadgamal00/CL-EPIDTN
RUN python -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='$MODEL_REPO', repo_type='model', allow_patterns=['artifacts_improved8/**'], local_dir='/app')"

# --- Application ---------------------------------------------------------
# Copies the API + model code only (artifacts already downloaded above; the
# artifacts dir is excluded from the build context via .dockerignore).
COPY . .

EXPOSE 7749

# /health reports model_loaded once artifacts finish loading at startup.
HEALTHCHECK --interval=30s --timeout=10s --start-period=180s --retries=3 \
    CMD curl -fsS http://localhost:${PORT}/health || exit 1

CMD ["sh", "-c", "uvicorn recommender_api_improved8:app --host 0.0.0.0 --port ${PORT}"]