Comfy-UI / Dockerfile
lokesh180340026's picture
a2
7be5c1a verified
# =============================================================
# 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} \
"]