AlaBoussoffara commited on
Commit
a934b9c
·
verified ·
1 Parent(s): b258fbc

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +50 -41
Dockerfile CHANGED
@@ -1,76 +1,85 @@
1
- # Dockerfile for Spaces — creates writable .files and runs Chainlit
2
- # Uses python:3.11-slim as base. For GPU/CUDA, replace base image accordingly.
3
 
4
  FROM python:3.11-slim
5
 
6
- ENV PYTHONUNBUFFERED=1
 
 
 
7
  WORKDIR /home/user/app
8
 
9
- # Build args to optionally fetch a model from the Hugging Face Hub during image build.
10
- # WARNING: passing secrets (HF_MODEL_TOKEN) as build-args will leave them in image history.
11
  ARG HF_MODEL_ID=""
12
  ARG HF_MODEL_NAME=""
13
  ARG HF_MODEL_REVISION=""
14
  ARG HF_MODEL_TOKEN=""
15
  ARG HF_MODEL_REPO_TYPE="model"
16
 
17
- # Create a non-root user (UID 1000) and home dir, then create .files with correct permissions.
18
- # Using a dedicated non-root user is a good practice for containerized Spaces.
19
  RUN apt-get update \
20
- && apt-get install -y --no-install-recommends build-essential git curl \
21
- && rm -rf /var/lib/apt/lists/* \
22
- && groupadd -g 1000 appuser || true \
23
- && useradd -m -u 1000 -g appuser -s /bin/bash appuser || true
24
 
25
- # Create app dir and .files, set ownership to appuser
26
  RUN mkdir -p /home/user/app/.files \
27
- && mkdir -p /home/user/app/.cache /home/user/app/.local /home/user/app/logs \
28
- && chown -R appuser:appuser /home/user/app \
29
- && chmod -R 700 /home/user/app/.files
 
 
 
30
 
31
- # Copy project files as root, then install deps as root
32
- COPY . /home/user/app
33
 
34
- # Use a requirements.txt if present; otherwise install package with [server] extras
35
  RUN python -m pip install --upgrade pip setuptools wheel
36
- RUN if [ -f /home/user/app/requirements.txt ]; then \
 
 
 
37
  pip install -r /home/user/app/requirements.txt; \
38
- pip install -e .[server];\
39
  else \
40
- # Install the project in editable mode so sources are available at runtime
41
  pip install -e .[server]; \
42
  fi
43
 
44
- # Optionally fetch a model from the Hugging Face Hub at build time. This is only
45
- # executed when HF_MODEL_ID is provided as a build-arg. The downloaded model will
46
- # be placed under /home/user/app/trained_models so it's baked into the image.
47
- RUN mkdir -p /home/user/app/trained_models \
48
- && if [ -n "${HF_MODEL_ID}" ]; then \
49
- echo "Fetching model ${HF_MODEL_ID} into /home/user/app/trained_models"; \
50
- mini-transformer-fetch "${HF_MODEL_ID}" --name "${HF_MODEL_NAME:-}" --revision "${HF_MODEL_REVISION:-}" --token "${HF_MODEL_TOKEN:-}" --repo-type "${HF_MODEL_REPO_TYPE:-model}" --model-root /home/user/app/trained_models --force; \
 
 
 
51
  else \
52
  echo "No HF_MODEL_ID provided; skipping model download"; \
53
  fi
54
 
55
- # If the project provides Makefile targets to fetch small/test models, run them now
56
- # so the models are present in the image before switching to the non-root user.
57
- RUN if [ -f /home/user/app/Makefile ]; then \
58
- echo "Running make fetch-small and make fetch-test"; \
59
  cd /home/user/app && make fetch-small && make fetch-test; \
60
  else \
61
- echo "No Makefile found; skipping 'make fetch-*'"; \
62
  fi
63
 
64
- # Ensure trained_models is owned by appuser, then switch to non-root user
65
- RUN chown -R appuser:appuser /home/user/app/trained_models || true
 
 
66
  USER appuser
67
- ENV HOME=/home/user/app
68
- ENV XDG_CACHE_HOME=/home/user/app/.cache
69
- ENV XDG_CONFIG_HOME=/home/user/app/.config
70
- ENV XDG_DATA_HOME=/home/user/app/.local/share
71
- ENV CHAINLIT_FILES_DIR=/home/user/app/.files
 
72
 
73
  EXPOSE 7860
74
 
75
- # Default command: run Chainlit against the packaged chainlit_app.py
76
  CMD ["bash", "-lc", "chainlit run src/mini_transformer/apps/chainlit_app.py --host 0.0.0.0 --port ${PORT:-7860}"]
 
1
+ # syntax=docker/dockerfile:1
2
+ # Dockerfile for Hugging Face Spaces (Chainlit + Mini-Transformer)
3
 
4
  FROM python:3.11-slim
5
 
6
+ ENV PYTHONUNBUFFERED=1 \
7
+ PYTHONDONTWRITEBYTECODE=1 \
8
+ PIP_NO_CACHE_DIR=1
9
+
10
  WORKDIR /home/user/app
11
 
12
+ # Optional build args to fetch a HF model at build time
 
13
  ARG HF_MODEL_ID=""
14
  ARG HF_MODEL_NAME=""
15
  ARG HF_MODEL_REVISION=""
16
  ARG HF_MODEL_TOKEN=""
17
  ARG HF_MODEL_REPO_TYPE="model"
18
 
19
+ # Create non-root runtime user
 
20
  RUN apt-get update \
21
+ && apt-get install -y --no-install-recommends build-essential git curl \
22
+ && rm -rf /var/lib/apt/lists/* \
23
+ && groupadd -g 1000 appuser || true \
24
+ && useradd -m -u 1000 -g appuser -s /bin/bash appuser || true
25
 
26
+ # Create runtime dirs now so Chainlit can write config/translations/files
27
  RUN mkdir -p /home/user/app/.files \
28
+ /home/user/app/.cache \
29
+ /home/user/app/.config \
30
+ /home/user/app/.local/share \
31
+ /home/user/app/logs \
32
+ /home/user/app/trained_models \
33
+ /home/user/app/.chainlit/translations
34
 
35
+ # Copy source with correct ownership (critical fix for your PermissionError)
36
+ COPY --chown=appuser:appuser . /home/user/app
37
 
38
+ # Install deps
39
  RUN python -m pip install --upgrade pip setuptools wheel
40
+ RUN if [ -f /home/user/app/req.txt ]; then \
41
+ pip install -r /home/user/app/req.txt; \
42
+ pip install -e .[server]; \
43
+ elif [ -f /home/user/app/requirements.txt ]; then \
44
  pip install -r /home/user/app/requirements.txt; \
45
+ pip install -e .[server]; \
46
  else \
 
47
  pip install -e .[server]; \
48
  fi
49
 
50
+ # Optional model download from HF Hub
51
+ RUN if [ -n "${HF_MODEL_ID}" ]; then \
52
+ set -- mini-transformer-fetch "${HF_MODEL_ID}" \
53
+ --repo-type "${HF_MODEL_REPO_TYPE}" \
54
+ --model-root /home/user/app/trained_models \
55
+ --force; \
56
+ if [ -n "${HF_MODEL_NAME}" ]; then set -- "$@" --name "${HF_MODEL_NAME}"; fi; \
57
+ if [ -n "${HF_MODEL_REVISION}" ]; then set -- "$@" --revision "${HF_MODEL_REVISION}"; fi; \
58
+ if [ -n "${HF_MODEL_TOKEN}" ]; then set -- "$@" --token "${HF_MODEL_TOKEN}"; fi; \
59
+ "$@"; \
60
  else \
61
  echo "No HF_MODEL_ID provided; skipping model download"; \
62
  fi
63
 
64
+ # Optional fallback fetch via Makefile (only when HF_MODEL_ID is not set)
65
+ RUN if [ -f /home/user/app/Makefile ] && [ -z "${HF_MODEL_ID}" ]; then \
 
 
66
  cd /home/user/app && make fetch-small && make fetch-test; \
67
  else \
68
+ echo "Skipping make fetch-*"; \
69
  fi
70
 
71
+ # Ensure all runtime-writable paths are owned by appuser
72
+ RUN chown -R appuser:appuser /home/user/app \
73
+ && chmod 700 /home/user/app/.files
74
+
75
  USER appuser
76
+ ENV HOME=/home/user/app \
77
+ XDG_CACHE_HOME=/home/user/app/.cache \
78
+ XDG_CONFIG_HOME=/home/user/app/.config \
79
+ XDG_DATA_HOME=/home/user/app/.local/share \
80
+ CHAINLIT_APP_ROOT=/home/user/app \
81
+ CHAINLIT_FILES_DIR=/home/user/app/.files
82
 
83
  EXPOSE 7860
84
 
 
85
  CMD ["bash", "-lc", "chainlit run src/mini_transformer/apps/chainlit_app.py --host 0.0.0.0 --port ${PORT:-7860}"]