Spaces:
Sleeping
Sleeping
| # 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}"] | |