# ============================================================= # ComfyUI Dockerfile for Hugging Face Spaces # With Persistent Storage & ComfyUI Manager # ============================================================= # Features: # - ComfyUI + ComfyUI-Manager pre-installed # - Persistent storage via /data (survives restarts) # - Auto GPU/CPU detection at runtime # - All models, custom nodes, outputs persist across rebuilds # - Self-contained — no external scripts needed # ============================================================= FROM python:3.11-slim-bookworm # --------------------------- # Environment variables # --------------------------- ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ COMFYUI_PATH=/app/ComfyUI \ COMFYUI_PORT=7860 \ PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ HF_HOME=/data/comfyui/.cache/huggingface # --------------------------- # System dependencies # --------------------------- RUN apt-get update && apt-get install -y --no-install-recommends \ git \ git-lfs \ wget \ curl \ libgl1 \ libglib2.0-0 \ libsm6 \ libxext6 \ libxrender1 \ libgomp1 \ ffmpeg \ procps \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # --------------------------- # Create app directory # --------------------------- RUN mkdir -p /app/cache/huggingface && \ chmod -R 777 /app WORKDIR /app # --------------------------- # Install PyTorch (CPU version — lightweight for build) # For GPU Spaces, replace with: # --extra-index-url https://download.pytorch.org/whl/cu121 # --------------------------- RUN pip install --upgrade pip && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # --------------------------- # Clone ComfyUI # --------------------------- RUN git clone --depth 1 https://github.com/Comfy-Org/ComfyUI.git ${COMFYUI_PATH} WORKDIR ${COMFYUI_PATH} # --------------------------- # Install ComfyUI dependencies # --------------------------- RUN pip install -r requirements.txt # --------------------------- # Install ComfyUI Manager # --------------------------- RUN git clone --depth 1 https://github.com/Comfy-Org/ComfyUI-Manager.git custom_nodes/ComfyUI-Manager # --------------------------- # Install additional packages commonly needed by nodes # --------------------------- RUN pip install \ aiohttp \ requests \ tqdm \ Pillow \ numpy \ scipy \ opencv-python-headless \ huggingface-hub \ safetensors \ accelerate \ pyyaml # --------------------------- # Create model directories (migrated to /data at runtime) # --------------------------- RUN mkdir -p \ models/checkpoints \ models/clip \ models/clip_vision \ models/controlnet \ models/diffusers \ models/embeddings \ models/gligen \ models/hypernetworks \ models/loras \ models/photomaker \ models/style_models \ models/unet \ models/upscale_models \ models/vae \ models/vae_approx \ models/configs \ input \ output \ temp \ user \ && chmod -R 777 /app # --------------------------- # Expose port (HuggingFace Spaces expects 7860) # --------------------------- EXPOSE 7860 # --------------------------- # Health check # --------------------------- HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=5 \ CMD curl -f http://localhost:${COMFYUI_PORT}/ || exit 1 # --------------------------- # Entrypoint: persistent storage setup + start ComfyUI # Everything is inline — no external script needed # --------------------------- CMD ["bash", "-c", "\ set -e && \ echo '============================================' && \ echo ' ComfyUI for Hugging Face Spaces' && \ echo ' Starting up...' && \ echo '============================================' && \ PERSISTENT_DIR=/data/comfyui && \ if [ -d /data ] && [ -w /data ]; then \ echo '[INFO] Persistent storage detected at /data' && \ echo '[INFO] Setting up persistent directories...' && \ mkdir -p ${PERSISTENT_DIR}/models/checkpoints && \ mkdir -p ${PERSISTENT_DIR}/models/clip && \ mkdir -p ${PERSISTENT_DIR}/models/clip_vision && \ mkdir -p ${PERSISTENT_DIR}/models/controlnet && \ mkdir -p ${PERSISTENT_DIR}/models/diffusers && \ mkdir -p ${PERSISTENT_DIR}/models/embeddings && \ mkdir -p ${PERSISTENT_DIR}/models/gligen && \ mkdir -p ${PERSISTENT_DIR}/models/hypernetworks && \ mkdir -p ${PERSISTENT_DIR}/models/loras && \ mkdir -p ${PERSISTENT_DIR}/models/photomaker && \ mkdir -p ${PERSISTENT_DIR}/models/style_models && \ mkdir -p ${PERSISTENT_DIR}/models/unet && \ mkdir -p ${PERSISTENT_DIR}/models/upscale_models && \ mkdir -p ${PERSISTENT_DIR}/models/vae && \ mkdir -p ${PERSISTENT_DIR}/models/vae_approx && \ mkdir -p ${PERSISTENT_DIR}/models/configs && \ mkdir -p ${PERSISTENT_DIR}/custom_nodes && \ mkdir -p ${PERSISTENT_DIR}/output && \ mkdir -p ${PERSISTENT_DIR}/input && \ mkdir -p ${PERSISTENT_DIR}/user && \ mkdir -p ${PERSISTENT_DIR}/temp && \ mkdir -p ${PERSISTENT_DIR}/.cache/huggingface && \ if [ -d ${COMFYUI_PATH}/models ] && [ ! -L ${COMFYUI_PATH}/models ]; then \ echo '[INFO] Migrating built-in models to persistent storage...' && \ cp -rn ${COMFYUI_PATH}/models/* ${PERSISTENT_DIR}/models/ 2>/dev/null || true && \ rm -rf ${COMFYUI_PATH}/models; \ fi && \ if [ -d ${COMFYUI_PATH}/custom_nodes ] && [ ! -L ${COMFYUI_PATH}/custom_nodes ]; then \ echo '[INFO] Migrating custom nodes to persistent storage...' && \ cp -rn ${COMFYUI_PATH}/custom_nodes/* ${PERSISTENT_DIR}/custom_nodes/ 2>/dev/null || true && \ rm -rf ${COMFYUI_PATH}/custom_nodes; \ fi && \ if [ -d ${COMFYUI_PATH}/output ] && [ ! -L ${COMFYUI_PATH}/output ]; then \ cp -rn ${COMFYUI_PATH}/output/* ${PERSISTENT_DIR}/output/ 2>/dev/null || true && \ rm -rf ${COMFYUI_PATH}/output; \ fi && \ if [ -d ${COMFYUI_PATH}/input ] && [ ! -L ${COMFYUI_PATH}/input ]; then \ cp -rn ${COMFYUI_PATH}/input/* ${PERSISTENT_DIR}/input/ 2>/dev/null || true && \ rm -rf ${COMFYUI_PATH}/input; \ fi && \ if [ -d ${COMFYUI_PATH}/user ] && [ ! -L ${COMFYUI_PATH}/user ]; then \ cp -rn ${COMFYUI_PATH}/user/* ${PERSISTENT_DIR}/user/ 2>/dev/null || true && \ rm -rf ${COMFYUI_PATH}/user; \ fi && \ ln -sfn ${PERSISTENT_DIR}/models ${COMFYUI_PATH}/models && \ ln -sfn ${PERSISTENT_DIR}/custom_nodes ${COMFYUI_PATH}/custom_nodes && \ ln -sfn ${PERSISTENT_DIR}/output ${COMFYUI_PATH}/output && \ ln -sfn ${PERSISTENT_DIR}/input ${COMFYUI_PATH}/input && \ ln -sfn ${PERSISTENT_DIR}/user ${COMFYUI_PATH}/user && \ ln -sfn ${PERSISTENT_DIR}/temp ${COMFYUI_PATH}/temp && \ export HF_HOME=${PERSISTENT_DIR}/.cache/huggingface && \ echo '[INFO] Persistent storage setup complete!' && \ echo '[INFO] Models: ${PERSISTENT_DIR}/models/' && \ echo '[INFO] Custom nodes: ${PERSISTENT_DIR}/custom_nodes/' && \ echo '[INFO] Outputs: ${PERSISTENT_DIR}/output/'; \ else \ echo '[WARNING] ==================================================' && \ echo '[WARNING] Persistent storage (/data) is NOT available!' && \ echo '[WARNING] All models and data will be LOST on restart.' && \ echo '[WARNING] Enable persistent storage in your Space settings.' && \ echo '[WARNING] =================================================='; \ fi && \ MANAGER_DIR=${COMFYUI_PATH}/custom_nodes/ComfyUI-Manager && \ if [ ! -d ${MANAGER_DIR} ] || [ -z \"$(ls -A ${MANAGER_DIR} 2>/dev/null)\" ]; then \ echo '[INFO] ComfyUI-Manager not found, installing...' && \ rm -rf ${MANAGER_DIR} && \ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI-Manager.git ${MANAGER_DIR}; \ fi && \ EXTRA_ARGS='' && \ if command -v nvidia-smi > /dev/null 2>&1 && nvidia-smi > /dev/null 2>&1; then \ echo '[INFO] NVIDIA GPU detected! Running in GPU mode.' && \ EXTRA_ARGS='--cuda-malloc'; \ else \ echo '[INFO] No GPU detected. Running in CPU mode.' && \ EXTRA_ARGS='--cpu'; \ fi && \ chmod -R 777 ${COMFYUI_PATH} 2>/dev/null || true && \ chmod -R 777 /data 2>/dev/null || true && \ echo '============================================' && \ echo ' ComfyUI starting on port ${COMFYUI_PORT}' && \ echo '============================================' && \ cd ${COMFYUI_PATH} && \ exec python main.py \ --listen 0.0.0.0 \ --port ${COMFYUI_PORT} \ --enable-cors-header \ --preview-method auto \ ${EXTRA_ARGS} \ "]