File size: 2,924 Bytes
a934b9c
 
13458f8
 
 
a934b9c
 
 
 
8ce5a19
13458f8
a934b9c
fd8bd32
 
 
 
 
 
a934b9c
13458f8
a934b9c
 
 
 
8ce5a19
a934b9c
8ce5a19
a934b9c
 
 
 
 
 
8ce5a19
a934b9c
 
8ce5a19
a934b9c
8ce5a19
a934b9c
 
 
 
8ce5a19
a934b9c
13458f8
7c31e8f
13458f8
 
a934b9c
 
 
 
 
 
 
 
 
 
fd8bd32
 
 
 
a934b9c
 
fd8bd32
 
a934b9c
fd8bd32
 
a934b9c
 
 
 
8ce5a19
a934b9c
 
 
 
 
 
7f38fd8
13458f8
 
8ce5a19
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
74
75
76
77
78
79
80
81
82
83
84
85
86
# syntax=docker/dockerfile:1
# Dockerfile for Hugging Face Spaces (Chainlit + Mini-Transformer)

FROM python:3.11-slim

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1

WORKDIR /home/user/app

# Optional build args to fetch a HF model at build time
ARG HF_MODEL_ID=""
ARG HF_MODEL_NAME=""
ARG HF_MODEL_REVISION=""
ARG HF_MODEL_TOKEN=""
ARG HF_MODEL_REPO_TYPE="model"

# Create non-root runtime user
RUN apt-get update \
 && apt-get install -y --no-install-recommends build-essential git curl \
 && rm -rf /var/lib/apt/lists/* \
 && groupadd -g 1000 appuser || true \
 && useradd -m -u 1000 -g appuser -s /bin/bash appuser || true

# Create runtime dirs now so Chainlit can write config/translations/files
RUN mkdir -p /home/user/app/.files \
    /home/user/app/.cache \
    /home/user/app/.config \
    /home/user/app/.local/share \
    /home/user/app/logs \
    /home/user/app/trained_models \
    /home/user/app/.chainlit/translations

# Copy source with correct ownership (critical fix for your PermissionError)
COPY --chown=appuser:appuser . /home/user/app

# Install deps
RUN python -m pip install --upgrade pip setuptools wheel
RUN if [ -f /home/user/app/req.txt ]; then \
      pip install -r /home/user/app/req.txt; \
      pip install -e .[server]; \
    elif [ -f /home/user/app/requirements.txt ]; then \
      pip install -r /home/user/app/requirements.txt; \
      pip install -e .[server]; \
    else \
      pip install -e .[server]; \
    fi

# Optional model download from HF Hub
RUN if [ -n "${HF_MODEL_ID}" ]; then \
      set -- mini-transformer-fetch "${HF_MODEL_ID}" \
             --repo-type "${HF_MODEL_REPO_TYPE}" \
             --model-root /home/user/app/trained_models \
             --force; \
      if [ -n "${HF_MODEL_NAME}" ]; then set -- "$@" --name "${HF_MODEL_NAME}"; fi; \
      if [ -n "${HF_MODEL_REVISION}" ]; then set -- "$@" --revision "${HF_MODEL_REVISION}"; fi; \
      if [ -n "${HF_MODEL_TOKEN}" ]; then set -- "$@" --token "${HF_MODEL_TOKEN}"; fi; \
      "$@"; \
    else \
      echo "No HF_MODEL_ID provided; skipping model download"; \
    fi

# Optional fallback fetch via Makefile (only when HF_MODEL_ID is not set)
RUN if [ -f /home/user/app/Makefile ] && [ -z "${HF_MODEL_ID}" ]; then \
      cd /home/user/app && make fetch-small && make fetch-test; \
    else \
      echo "Skipping make fetch-*"; \
    fi

# Ensure all runtime-writable paths are owned by appuser
RUN chown -R appuser:appuser /home/user/app \
 && chmod 700 /home/user/app/.files

USER appuser
ENV HOME=/home/user/app \
    XDG_CACHE_HOME=/home/user/app/.cache \
    XDG_CONFIG_HOME=/home/user/app/.config \
    XDG_DATA_HOME=/home/user/app/.local/share \
    CHAINLIT_APP_ROOT=/home/user/app \
    CHAINLIT_FILES_DIR=/home/user/app/.files

EXPOSE 7860

CMD ["bash", "-lc", "chainlit run src/mini_transformer/apps/chainlit_app.py --host 0.0.0.0 --port ${PORT:-7860}"]