- No hot-reload: handler.py, start.sh, and network_volume.py are
ADDed into the Docker image at build time (to/). Any change requires a fulldocker buildbefore testing with docker-compose. - Platform mismatch: Always build with
--platform linux/amd64for Runpod deployment. Omitting this on ARM hosts (Apple Silicon) produces images that silently fail on Runpod. - No linter or formatter configured: Follow PEP 8 by convention; there are no pre-commit hooks or CI lint checks.
- ComfyUI-Manager forced offline:
start.shcallscomfy-manager-set-mode offlineon every boot. Custom nodes cannot be installed at runtime through the Manager UI — they must be baked into the Docker image. - Network volume mount point: Models on a network volume must match the directory structure in
src/extra_model_paths.yaml. The volume is expected at/runpod-volumewith acomfyui/models/subtree.
Node types map to model directories — this is ComfyUI domain knowledge not encoded in handler code:
UpscaleModelLoader→upscale_modelsVAELoader→vaeUNETLoader,UnetLoaderGGUF,Hy3DModelLoader→diffusion_modelsDualCLIPLoader,TripleCLIPLoader→text_encodersLoraLoader→loras
Some custom nodes have dependency conflicts that only surface at runtime:
- ComfyUI-BrushNet: Requires
diffusers>=0.29.0,accelerate>=0.29.0,<0.32.0, andpeft>=0.7.0. Without these exact ranges, you get silent import errors. - General pattern: When a custom node fails with import errors, check its dependency chain and pin versions in the Dockerfile with
uv pip install.