a2
Browse files- Dockerfile +106 -12
Dockerfile
CHANGED
|
@@ -7,6 +7,7 @@
|
|
| 7 |
# - Persistent storage via /data (survives restarts)
|
| 8 |
# - Auto GPU/CPU detection at runtime
|
| 9 |
# - All models, custom nodes, outputs persist across rebuilds
|
|
|
|
| 10 |
# =============================================================
|
| 11 |
|
| 12 |
FROM python:3.11-slim-bookworm
|
|
@@ -53,8 +54,8 @@ WORKDIR /app
|
|
| 53 |
|
| 54 |
# ---------------------------
|
| 55 |
# Install PyTorch (CPU version — lightweight for build)
|
| 56 |
-
# GPU Spaces
|
| 57 |
-
#
|
| 58 |
# ---------------------------
|
| 59 |
RUN pip install --upgrade pip && \
|
| 60 |
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
|
|
@@ -93,7 +94,7 @@ RUN pip install \
|
|
| 93 |
pyyaml
|
| 94 |
|
| 95 |
# ---------------------------
|
| 96 |
-
# Create model directories (
|
| 97 |
# ---------------------------
|
| 98 |
RUN mkdir -p \
|
| 99 |
models/checkpoints \
|
|
@@ -118,12 +119,6 @@ RUN mkdir -p \
|
|
| 118 |
user \
|
| 119 |
&& chmod -R 777 /app
|
| 120 |
|
| 121 |
-
# ---------------------------
|
| 122 |
-
# Copy entrypoint script
|
| 123 |
-
# ---------------------------
|
| 124 |
-
COPY start.sh /app/start.sh
|
| 125 |
-
RUN chmod +x /app/start.sh
|
| 126 |
-
|
| 127 |
# ---------------------------
|
| 128 |
# Expose port (HuggingFace Spaces expects 7860)
|
| 129 |
# ---------------------------
|
|
@@ -136,6 +131,105 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=5 \
|
|
| 136 |
CMD curl -f http://localhost:${COMFYUI_PORT}/ || exit 1
|
| 137 |
|
| 138 |
# ---------------------------
|
| 139 |
-
#
|
| 140 |
-
#
|
| 141 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
# - Persistent storage via /data (survives restarts)
|
| 8 |
# - Auto GPU/CPU detection at runtime
|
| 9 |
# - All models, custom nodes, outputs persist across rebuilds
|
| 10 |
+
# - Self-contained — no external scripts needed
|
| 11 |
# =============================================================
|
| 12 |
|
| 13 |
FROM python:3.11-slim-bookworm
|
|
|
|
| 54 |
|
| 55 |
# ---------------------------
|
| 56 |
# Install PyTorch (CPU version — lightweight for build)
|
| 57 |
+
# For GPU Spaces, replace with:
|
| 58 |
+
# --extra-index-url https://download.pytorch.org/whl/cu121
|
| 59 |
# ---------------------------
|
| 60 |
RUN pip install --upgrade pip && \
|
| 61 |
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
|
|
|
|
| 94 |
pyyaml
|
| 95 |
|
| 96 |
# ---------------------------
|
| 97 |
+
# Create model directories (migrated to /data at runtime)
|
| 98 |
# ---------------------------
|
| 99 |
RUN mkdir -p \
|
| 100 |
models/checkpoints \
|
|
|
|
| 119 |
user \
|
| 120 |
&& chmod -R 777 /app
|
| 121 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
# ---------------------------
|
| 123 |
# Expose port (HuggingFace Spaces expects 7860)
|
| 124 |
# ---------------------------
|
|
|
|
| 131 |
CMD curl -f http://localhost:${COMFYUI_PORT}/ || exit 1
|
| 132 |
|
| 133 |
# ---------------------------
|
| 134 |
+
# Entrypoint: persistent storage setup + start ComfyUI
|
| 135 |
+
# Everything is inline — no external script needed
|
| 136 |
+
# ---------------------------
|
| 137 |
+
CMD ["bash", "-c", "\
|
| 138 |
+
set -e && \
|
| 139 |
+
echo '============================================' && \
|
| 140 |
+
echo ' ComfyUI for Hugging Face Spaces' && \
|
| 141 |
+
echo ' Starting up...' && \
|
| 142 |
+
echo '============================================' && \
|
| 143 |
+
PERSISTENT_DIR=/data/comfyui && \
|
| 144 |
+
if [ -d /data ] && [ -w /data ]; then \
|
| 145 |
+
echo '[INFO] Persistent storage detected at /data' && \
|
| 146 |
+
echo '[INFO] Setting up persistent directories...' && \
|
| 147 |
+
mkdir -p ${PERSISTENT_DIR}/models/checkpoints && \
|
| 148 |
+
mkdir -p ${PERSISTENT_DIR}/models/clip && \
|
| 149 |
+
mkdir -p ${PERSISTENT_DIR}/models/clip_vision && \
|
| 150 |
+
mkdir -p ${PERSISTENT_DIR}/models/controlnet && \
|
| 151 |
+
mkdir -p ${PERSISTENT_DIR}/models/diffusers && \
|
| 152 |
+
mkdir -p ${PERSISTENT_DIR}/models/embeddings && \
|
| 153 |
+
mkdir -p ${PERSISTENT_DIR}/models/gligen && \
|
| 154 |
+
mkdir -p ${PERSISTENT_DIR}/models/hypernetworks && \
|
| 155 |
+
mkdir -p ${PERSISTENT_DIR}/models/loras && \
|
| 156 |
+
mkdir -p ${PERSISTENT_DIR}/models/photomaker && \
|
| 157 |
+
mkdir -p ${PERSISTENT_DIR}/models/style_models && \
|
| 158 |
+
mkdir -p ${PERSISTENT_DIR}/models/unet && \
|
| 159 |
+
mkdir -p ${PERSISTENT_DIR}/models/upscale_models && \
|
| 160 |
+
mkdir -p ${PERSISTENT_DIR}/models/vae && \
|
| 161 |
+
mkdir -p ${PERSISTENT_DIR}/models/vae_approx && \
|
| 162 |
+
mkdir -p ${PERSISTENT_DIR}/models/configs && \
|
| 163 |
+
mkdir -p ${PERSISTENT_DIR}/custom_nodes && \
|
| 164 |
+
mkdir -p ${PERSISTENT_DIR}/output && \
|
| 165 |
+
mkdir -p ${PERSISTENT_DIR}/input && \
|
| 166 |
+
mkdir -p ${PERSISTENT_DIR}/user && \
|
| 167 |
+
mkdir -p ${PERSISTENT_DIR}/temp && \
|
| 168 |
+
mkdir -p ${PERSISTENT_DIR}/.cache/huggingface && \
|
| 169 |
+
if [ -d ${COMFYUI_PATH}/models ] && [ ! -L ${COMFYUI_PATH}/models ]; then \
|
| 170 |
+
echo '[INFO] Migrating built-in models to persistent storage...' && \
|
| 171 |
+
cp -rn ${COMFYUI_PATH}/models/* ${PERSISTENT_DIR}/models/ 2>/dev/null || true && \
|
| 172 |
+
rm -rf ${COMFYUI_PATH}/models; \
|
| 173 |
+
fi && \
|
| 174 |
+
if [ -d ${COMFYUI_PATH}/custom_nodes ] && [ ! -L ${COMFYUI_PATH}/custom_nodes ]; then \
|
| 175 |
+
echo '[INFO] Migrating custom nodes to persistent storage...' && \
|
| 176 |
+
cp -rn ${COMFYUI_PATH}/custom_nodes/* ${PERSISTENT_DIR}/custom_nodes/ 2>/dev/null || true && \
|
| 177 |
+
rm -rf ${COMFYUI_PATH}/custom_nodes; \
|
| 178 |
+
fi && \
|
| 179 |
+
if [ -d ${COMFYUI_PATH}/output ] && [ ! -L ${COMFYUI_PATH}/output ]; then \
|
| 180 |
+
cp -rn ${COMFYUI_PATH}/output/* ${PERSISTENT_DIR}/output/ 2>/dev/null || true && \
|
| 181 |
+
rm -rf ${COMFYUI_PATH}/output; \
|
| 182 |
+
fi && \
|
| 183 |
+
if [ -d ${COMFYUI_PATH}/input ] && [ ! -L ${COMFYUI_PATH}/input ]; then \
|
| 184 |
+
cp -rn ${COMFYUI_PATH}/input/* ${PERSISTENT_DIR}/input/ 2>/dev/null || true && \
|
| 185 |
+
rm -rf ${COMFYUI_PATH}/input; \
|
| 186 |
+
fi && \
|
| 187 |
+
if [ -d ${COMFYUI_PATH}/user ] && [ ! -L ${COMFYUI_PATH}/user ]; then \
|
| 188 |
+
cp -rn ${COMFYUI_PATH}/user/* ${PERSISTENT_DIR}/user/ 2>/dev/null || true && \
|
| 189 |
+
rm -rf ${COMFYUI_PATH}/user; \
|
| 190 |
+
fi && \
|
| 191 |
+
ln -sfn ${PERSISTENT_DIR}/models ${COMFYUI_PATH}/models && \
|
| 192 |
+
ln -sfn ${PERSISTENT_DIR}/custom_nodes ${COMFYUI_PATH}/custom_nodes && \
|
| 193 |
+
ln -sfn ${PERSISTENT_DIR}/output ${COMFYUI_PATH}/output && \
|
| 194 |
+
ln -sfn ${PERSISTENT_DIR}/input ${COMFYUI_PATH}/input && \
|
| 195 |
+
ln -sfn ${PERSISTENT_DIR}/user ${COMFYUI_PATH}/user && \
|
| 196 |
+
ln -sfn ${PERSISTENT_DIR}/temp ${COMFYUI_PATH}/temp && \
|
| 197 |
+
export HF_HOME=${PERSISTENT_DIR}/.cache/huggingface && \
|
| 198 |
+
echo '[INFO] Persistent storage setup complete!' && \
|
| 199 |
+
echo '[INFO] Models: ${PERSISTENT_DIR}/models/' && \
|
| 200 |
+
echo '[INFO] Custom nodes: ${PERSISTENT_DIR}/custom_nodes/' && \
|
| 201 |
+
echo '[INFO] Outputs: ${PERSISTENT_DIR}/output/'; \
|
| 202 |
+
else \
|
| 203 |
+
echo '[WARNING] ==================================================' && \
|
| 204 |
+
echo '[WARNING] Persistent storage (/data) is NOT available!' && \
|
| 205 |
+
echo '[WARNING] All models and data will be LOST on restart.' && \
|
| 206 |
+
echo '[WARNING] Enable persistent storage in your Space settings.' && \
|
| 207 |
+
echo '[WARNING] =================================================='; \
|
| 208 |
+
fi && \
|
| 209 |
+
MANAGER_DIR=${COMFYUI_PATH}/custom_nodes/ComfyUI-Manager && \
|
| 210 |
+
if [ ! -d ${MANAGER_DIR} ] || [ -z \"$(ls -A ${MANAGER_DIR} 2>/dev/null)\" ]; then \
|
| 211 |
+
echo '[INFO] ComfyUI-Manager not found, installing...' && \
|
| 212 |
+
rm -rf ${MANAGER_DIR} && \
|
| 213 |
+
git clone --depth 1 https://github.com/Comfy-Org/ComfyUI-Manager.git ${MANAGER_DIR}; \
|
| 214 |
+
fi && \
|
| 215 |
+
EXTRA_ARGS='' && \
|
| 216 |
+
if command -v nvidia-smi > /dev/null 2>&1 && nvidia-smi > /dev/null 2>&1; then \
|
| 217 |
+
echo '[INFO] NVIDIA GPU detected! Running in GPU mode.' && \
|
| 218 |
+
EXTRA_ARGS='--cuda-malloc'; \
|
| 219 |
+
else \
|
| 220 |
+
echo '[INFO] No GPU detected. Running in CPU mode.' && \
|
| 221 |
+
EXTRA_ARGS='--cpu'; \
|
| 222 |
+
fi && \
|
| 223 |
+
chmod -R 777 ${COMFYUI_PATH} 2>/dev/null || true && \
|
| 224 |
+
chmod -R 777 /data 2>/dev/null || true && \
|
| 225 |
+
echo '============================================' && \
|
| 226 |
+
echo ' ComfyUI starting on port ${COMFYUI_PORT}' && \
|
| 227 |
+
echo '============================================' && \
|
| 228 |
+
cd ${COMFYUI_PATH} && \
|
| 229 |
+
exec python main.py \
|
| 230 |
+
--listen 0.0.0.0 \
|
| 231 |
+
--port ${COMFYUI_PORT} \
|
| 232 |
+
--enable-cors-header \
|
| 233 |
+
--preview-method auto \
|
| 234 |
+
${EXTRA_ARGS} \
|
| 235 |
+
"]
|