Melika Kheirieh commited on
Commit
cdd9515
·
1 Parent(s): 31efb12

fix(docker): align Dockerfile with HF runtime (expose 7860 & run FastAPI + Gradio)

Browse files
Files changed (1) hide show
  1. Dockerfile +62 -20
Dockerfile CHANGED
@@ -1,29 +1,71 @@
1
- # ---------- Base ----------
2
- FROM python:3.12-slim
3
- WORKDIR /app
4
 
5
- ENV PYTHONUNBUFFERED=1 \
6
  PYTHONDONTWRITEBYTECODE=1 \
7
- PIP_NO_CACHE_DIR=1
 
 
 
 
 
 
8
 
9
- # ---------- Install dependencies ----------
10
  COPY requirements.txt .
11
- RUN apt-get update && apt-get install -y --no-install-recommends curl && \
12
- pip install --no-cache-dir -r requirements.txt && \
13
- rm -rf /var/lib/apt/lists/*
 
 
 
 
 
 
 
 
 
14
 
15
- # ---------- Copy app ----------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  COPY . .
17
 
18
- # ---------- Metadata ----------
19
- LABEL org.opencontainers.image.title="nl2sql-copilot" \
20
- org.opencontainers.image.description="Hybrid FastAPI + Gradio demo for Hugging Face Spaces" \
21
- org.opencontainers.image.version="1.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- # ---------- Healthcheck ----------
24
- HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
25
- CMD curl -fs http://localhost:7860/ || exit 1
26
 
27
- # ---------- Run both backend & frontend ----------
28
- EXPOSE 7860 8000
29
- CMD ["bash", "-c", "uvicorn main:app --host 0.0.0.0 --port 8000 & python demo/app.py"]
 
 
 
1
+ # ---------- Stage 1: Build wheels ----------
2
+ FROM python:3.12-slim AS builder
 
3
 
4
+ ENV PIP_NO_CACHE_DIR=1 \
5
  PYTHONDONTWRITEBYTECODE=1 \
6
+ PYTHONUNBUFFERED=1
7
+
8
+ WORKDIR /build
9
+
10
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
+ build-essential \
12
+ && rm -rf /var/lib/apt/lists/*
13
 
 
14
  COPY requirements.txt .
15
+ RUN pip install --upgrade pip && \
16
+ pip wheel --wheel-dir /wheels -r requirements.txt
17
+
18
+ # ---------- Stage 2: Runtime image ----------
19
+ FROM python:3.12-slim AS runtime
20
+
21
+ ENV PIP_NO_CACHE_DIR=1 \
22
+ PYTHONDONTWRITEBYTECODE=1 \
23
+ PYTHONUNBUFFERED=1 \
24
+ PYTHONPATH=/app
25
+
26
+ WORKDIR /app
27
 
28
+ # HTTPS certs for outbound calls
29
+ RUN apt-get update && apt-get install -y --no-install-recommends \
30
+ ca-certificates \
31
+ && rm -rf /var/lib/apt/lists/*
32
+
33
+ # Create non-root user
34
+ RUN useradd -m appuser
35
+
36
+ # Install deps from wheels
37
+ COPY --from=builder /wheels /wheels
38
+ COPY requirements.txt .
39
+ RUN pip install --no-cache-dir --find-links=/wheels -r requirements.txt && \
40
+ rm -rf /wheels
41
+
42
+ # App code
43
  COPY . .
44
 
45
+ # Permissions
46
+ RUN chown -R appuser:appuser /app
47
+
48
+ # ---- HF expects the *public* web app on port 7860 ----
49
+ ENV GRADIO_SERVER_NAME=0.0.0.0 \
50
+ GRADIO_SERVER_PORT=7860 \
51
+ USE_MOCK=1
52
+
53
+ USER appuser
54
+
55
+ # Healthcheck on Gradio UI port
56
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
57
+ CMD python -c "import urllib.request, sys; \
58
+ import urllib.error; \
59
+ import time; \
60
+ url='http://127.0.0.1:7860/'; \
61
+ import urllib.request as u; \
62
+ sys.exit(0) if u.urlopen(url, timeout=2).getcode() == 200 else sys.exit(1)"
63
 
64
+ # Expose HF-facing port (Gradio)
65
+ EXPOSE 7860
 
66
 
67
+ # Run FastAPI on 8000 (internal) AND Gradio on 7860 (public)
68
+ CMD ["sh", "-c", "\
69
+ uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --workers ${UVICORN_WORKERS:-1} & \
70
+ python -m demo.app \
71
+ "]