File size: 1,632 Bytes
9ccd45c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# ---- Frontend build stage (React -> static files) ----
FROM node:20-slim AS frontend
WORKDIR /frontend
# Copy only manifest first for layer caching
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ ./
# Produces /frontend/dist (Vite) — change to build/ if you use CRA
RUN npm run build

# ---- Runtime stage (CUDA for imaging models on T4) ----
FROM nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04

# System deps as root BEFORE creating the non-root user
RUN apt-get update && apt-get install -y --no-install-recommends \
        python3.11 python3-pip python3.11-venv \
        build-essential curl git ffmpeg libgl1 libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

RUN ln -sf /usr/bin/python3.11 /usr/bin/python

# Spaces runs your container as UID 1000 — create the matching user
RUN useradd -m -u 1000 user
ENV HOME=/home/user \
    PATH=/home/user/.local/bin:$PATH \
    # Model/cache dir. Ephemeral on free tier — fine, models re-download on boot.
    HF_HOME=/home/user/.cache/huggingface \
    PYTHONUNBUFFERED=1

WORKDIR /app

# Python deps (do NOT run any GPU/nvidia-smi command here — no GPU at build time)
COPY --chown=user requirements.txt ./
RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir -r requirements.txt

# App code
COPY --chown=user backend/ ./backend/
COPY --chown=user startup.sh ./startup.sh

# Built React static files from stage 1
COPY --chown=user --from=frontend /frontend/dist ./static

RUN chmod +x ./startup.sh && chown -R user:user /app
USER user

# Spaces exposes a single public port; must match app_port in README
EXPOSE 7860

CMD ["./startup.sh"]