lucid-natsar-dev / Dockerfile
lucid-hf's picture
CI: deploy Docker/PDM Space
7e6fce1 verified
FROM python:3.11-slim
WORKDIR /services/app_service
# System packages for video/image processing and OpenCV runtime
RUN apt-get update && apt-get install -y \
ffmpeg \
curl \
git \
git-lfs \
libgl1 \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/* \
&& git lfs install
# Reduce build-time and run-time memory usage and set writable config dirs
ENV PIP_NO_CACHE_DIR=1 \
PIP_ROOT_USER_ACTION=ignore \
OMP_NUM_THREADS=1 \
MKL_NUM_THREADS=1 \
OPENBLAS_NUM_THREADS=1 \
HOME=/tmp \
XDG_CACHE_HOME=/tmp/.cache \
MPLCONFIGDIR=/tmp/matplotlib \
YOLO_CONFIG_DIR=/tmp/Ultralytics \
STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
# Create config/cache dirs to avoid permission issues
RUN mkdir -p /tmp/.streamlit /tmp/.cache /tmp/matplotlib /tmp/Ultralytics \
&& chmod -R 777 /tmp/.streamlit /tmp/.cache /tmp/matplotlib /tmp/Ultralytics
# Create Streamlit config file to disable XSRF protection for Hugging Face Spaces
RUN echo "[server]\nenableXsrfProtection = false\n" > /tmp/.streamlit/config.toml
# Python deps (CUDA-enabled PyTorch wheels + all other dependencies)
RUN python -m pip install --upgrade pip setuptools wheel && \
pip install --no-cache-dir \
streamlit==1.49.1 \
moviepy==2.2.1 \
pillow>=10.0.0 \
opencv-python>=4.6.0 \
ultralytics==8.0.196 \
yt-dlp>=2025.10.22 \
torch==2.5.1 torchvision==0.20.1 --extra-index-url https://download.pytorch.org/whl/cu121
# Copy entire repository and download script
COPY . /tmp/repo
WORKDIR /tmp/repo
# Pull LFS files and copy app service
RUN git lfs pull && cp -r services/app_service/* /services/app_service/
WORKDIR /services/app_service
# Ensure app directory is writable at runtime
RUN chmod -R 777 /services/app_service
# Streamlit config via env
ENV STREAMLIT_SERVER_ENABLECORS=false \
STREAMLIT_SERVER_ENABLE_XSRF_PROTECTION=false \
STREAMLIT_SERVER_ADDRESS=0.0.0.0 \
STREAMLIT_SERVER_HEADLESS=true \
STREAMLIT_SERVER_MAX_UPLOAD_SIZE=200
# Hugging Face Spaces will set $PORT (default 7860) β€” listen on that
ENV PORT=7860
EXPOSE 7860
# Healthcheck should also use $PORT
HEALTHCHECK CMD curl --fail http://localhost:${PORT}/_stcore/health || exit 1
# Use $PORT instead of hard-coding 8501
ENTRYPOINT ["sh", "-c", "streamlit run app.py --server.port=$PORT --server.address=0.0.0.0 --server.enableXsrfProtection=false"]