dgx-spark-playbooks/nvidia/station-comfyui/assets/Dockerfile
2026-05-26 18:25:53 +00:00

78 lines
3.5 KiB
Docker

FROM nvcr.io/nvidia/pytorch:26.02-py3
WORKDIR /opt/ComfyUI
# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
ffmpeg \
libgl1 \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
# Clone ComfyUI
RUN git clone https://github.com/comfyanonymous/ComfyUI.git .
# Install ComfyUI dependencies WITHOUT overwriting NGC-optimized PyTorch.
# Strip torch/torchvision/torchaudio lines from ComfyUI requirements (pip must not replace NGC wheels).
RUN sed -i '/^torch\b/d; /^torchvision\b/d; /^torchaudio\b/d; /^nvidia/d' requirements.txt && \
pip install --no-cache-dir -r requirements.txt
# Provide an import-only torchaudio stub. NGC PyTorch 26.02 exports custom
# ABI symbols (e.g. torch_dtype_float4_e2m1fn_x2) that PyPI's torchaudio
# wheel does not export, so `pip install torchaudio` produces an
# unloadable libtorchaudio.abi3.so. ComfyUI's comfy/sd.py unconditionally
# imports comfy.ldm.lightricks.vae.audio_vae which imports torchaudio,
# so the import has to succeed even though we don't use audio VAE.
# Lightricks audio VAE is not exercised by any workflow in this playbook.
RUN SITE=$(python -c "import site; print(site.getsitepackages()[0])") && \
mkdir -p "$SITE/torchaudio" && \
printf '%s\n' \
'# Audio VAE stub for NGC PyTorch images. See assets/Dockerfile for context.' \
'__version__ = "0.0.0+ngc-stub"' \
'' \
'class _Unavailable:' \
' def __getattr__(self, name):' \
' raise RuntimeError(' \
' "torchaudio is stubbed in this NGC image; audio workflows are not supported."' \
' )' \
'' \
'functional = _Unavailable()' \
'transforms = _Unavailable()' \
> "$SITE/torchaudio/__init__.py" && \
python -c "import torchaudio; assert torchaudio.__version__.endswith('ngc-stub')"
# Install custom nodes
RUN cd custom_nodes && \
git clone https://github.com/Comfy-Org/ComfyUI-Manager.git && \
git clone https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite.git && \
git clone https://github.com/kijai/ComfyUI-KJNodes.git && \
git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git && \
git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git && \
git clone https://github.com/lum3on/comfyui_HiDream-Sampler.git && \
git clone https://github.com/Fannovel16/ComfyUI-Frame-Interpolation.git
# Install custom node dependencies.
#
# Two pre-processing fixes before the install loop:
# 1. onnxruntime-gpu has no aarch64 wheel on PyPI; on Grace (arm64)
# the install fails and pip skips the package. controlnet_aux
# preprocessors then crash at runtime with "No module named
# onnxruntime". Swap it for the plain `onnxruntime` (CPU) wheel,
# which IS published for aarch64 — preprocessors then run on CPU.
# 2. Some custom nodes pin packages that conflict with the NGC torch
# constraint set; we drop torch/torchvision/torchaudio lines in
# each custom-node requirements.txt for the same reason as the
# ComfyUI requirements step above.
RUN for req in custom_nodes/*/requirements.txt; do \
[ -f "$req" ] || continue; \
sed -i 's/^onnxruntime-gpu\b/onnxruntime/' "$req"; \
sed -i '/^torch\b/d; /^torchvision\b/d; /^torchaudio\b/d' "$req"; \
done && \
for req in custom_nodes/*/requirements.txt; do \
[ -f "$req" ] && pip install --no-cache-dir -r "$req" || true; \
done
EXPOSE 8188
CMD ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188"]