Mini-Transformer / Dockerfile
AlaBoussoffara's picture
Update Dockerfile
a934b9c verified
Raw
History Blame Contribute Delete
2.92 kB
# 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}"]