/ComfyUI-Docker

🐳Dockerfile for 🎨ComfyUI. | 容器镜像与启动脚本

Primary LanguageDockerfileOtherNOASSERTION

Docker image for ComfyUI

GitHub Workflow Status GitHub Workflow Status

Concept Design

This repo is for Docker images that runs ComfyUI - a Stable Diffusion GUI powering node-based workflow.

How it works

  1. At first start, a script will download latest ComfyUI, ComfyUI-Manager and some models.

  2. The whole ComfyUI will be stored in a local folder (./storage/ComfyUI).

  3. If you already have a ComfyUI bundle, put it there and make an empty file (./storage/.download-complete) so the start script will skip downloading.

  4. Use ComfyUI-Manager (in ComfyUI web page) to update ComfyUI, manage custom nodes, and download models.

Prerequisites

  • NVIDIA GPU with ≥6GB VRAM

  • Latest NVIDIA GPU driver

    • Either Game or Studio edition will work.

    • You don’t need to install drivers inside containers. Just make sure it’s working on your host OS.

  • Docker Installed

Usage - NVIDIA GPU

A. Using docker compose
git clone https://github.com/YanWenKun/ComfyUI-Docker.git

cd ComfyUI-Docker

docker compose up --detach

# Update image (only when Python components are outdated)
git pull
docker compose pull
docker compose up --detach --remove-orphans
docker image prune
B. Using docker run
mkdir -p storage

docker run -it \
  --name comfyui \
  --gpus all \
  -p 8188:8188 \
  -v "$(pwd)"/storage:/home/runner \
  --env CLI_ARGS="" \
  yanwk/comfyui-boot:latest

# Update image (only when Python components are outdated)
docker rm comfyui
docker pull yanwk/comfyui-boot:latest
# Then re-run 'docker run' above again

Once the app is loaded, visit http://localhost:8188/

Usage - AMD GPU (Experimental)

Note
Recommend AMD users to run ComfyUI on Windows with ZLUDA. Running on Linux needs some experience.
Note
If you are using WSL2 with AMD/Intel GPU, consider Run ComfyUI on WSL2 with DirectML.
Note
On Linux hosts, install Radeon software for Linux with ROCm first.
C. Using docker compose
git clone https://github.com/YanWenKun/ComfyUI-Docker.git

cd ComfyUI-Docker

docker compose -f docker-compose-rocm.yml up --detach

# Update image (only when Python components are outdated)
git pull
docker compose -f docker-compose-rocm.yml pull
docker compose -f docker-compose-rocm.yml up --detach --remove-orphans
docker image prune
D. Using docker run (as root)
mkdir -p storage

docker run -it --rm \
  --name comfyui-root \
  --device=/dev/kfd --device=/dev/dri \
  --group-add=video --ipc=host --cap-add=SYS_PTRACE \
  --security-opt seccomp=unconfined \
  --security-opt label=disable \
  -p 8188:8188 \
  --env CLI_ARGS="--use-pytorch-cross-attention" \
  --user root --workdir /root \
  -v "$(pwd)"/storage:/root \
  yanwk/comfyui-boot:rocm \
  /bin/bash /home/scripts/root-wrapper.sh

Once the app is loaded, visit http://localhost:8188/

Q & A

Q: My GPU has only 4GB VRAM
A: Add --lowvram to CLI_ARGS.

Q: Adding --lowvram still out-of-memory
A: Use --novram instead. It will use CPU RAM.

Q: How to run on CPU?
A: Add --cpu to CLI_ARGS. It’s pretty slow.

Q: I don’t want to use xFormers, how to use PyTorch’s Cross Attention?
A: Add --use-pytorch-cross-attention to CLI_ARGS. It may perform well on WSL2, but significantly slower on Linux hosts.

More CLI_ARGS available at ComfyUI.

Some commands for debugging

Build the image, print all logs to STDOUT
docker build . --progress=plain -f Dockerfile -t yanwk/comfyui-boot:latest
Run a one-time container
docker run -it --rm \
  --gpus all -p 8188:8188 \
  --volume "$(pwd)"/storage:/home/runner \
  --env CLI_ARGS="" \
  yanwk/comfyui-boot:latest
Run into a root bash
docker run -it --rm \
  --gpus all -p 8188:8188 \
  --volume "$(pwd)"/storage:/home/runner \
  --env CLI_ARGS="" \
  --user root \
  yanwk/comfyui-boot:latest /bin/bash

Run with Podman

Podman is root-less by default. And it’s tricky to bind-mount volume as non-root user inside rootless container. Options provided by Podman will chown files on host space, which probably is undesirable.

I recommend two different ways to workaround:

1. Go "root-ful" just like Docker

Expand details

The straightforward way. By adding sudo you go from rootless to rootful. And everything else would be the same as using Docker.
Note that sudo Podman will download images to root space. If you already downloaded the image in current user, you can local-copy it:
sudo podman image scp username@localhost::docker.io/yanwk/comfyui-boot:latest

mkdir -p storage

sudo podman run -it --rm \
  --name comfyui-rootful \
  --device nvidia.com/gpu=all \
  --security-opt label=disable \
  -p 8188:8188 \
  -v "$(pwd)"/storage:/home/runner \
  -e CLI_ARGS="" \
  docker.io/yanwk/comfyui-boot

2. Run as root inside container

Expand details

The rootless way, no sudo needed. Inside the pod, Podman will mount volume as root, scripts will run as root. And from the host side, we see files keep their original ownership.

mkdir -p storage

podman run -it --rm \
  --name comfyui-rootless \
  --device nvidia.com/gpu=all \
  --security-opt label=disable \
  -p 8188:8188 \
  -v "$(pwd)"/storage:/root \
  --user root \
  --workdir /root \
  -e CLI_ARGS="" \
  docker.io/yanwk/comfyui-boot:latest \
  /bin/bash /home/scripts/root-wrapper.sh

Clean up cache files

If having issues when updating, try clean cache.
Usually this is not needed. Some custom nodes use huggingface_hub to download models and store them in .cache.

docker exec -it --workdir /home/runner  comfyui \
  rm -rf .cache/ .config/ .local/ .nv/ bin/ include/ lib/ lib64 pyvenv.cfg

docker restart comfyui

Some custom nodes

Install a bunch of custom nodes that may save you some time

Note that most dependencies are bundled in the image, you don’t need to manually install them.
(Except imageio-ffmpeg which uses FFmpeg4. The image came with FFmpeg6 or newer.)

cd ComfyUI/custom_nodes/

gcs='git clone --depth=1 --no-tags --recurse-submodules --shallow-submodules'

$gcs https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation.git
$gcs https://github.com/bash-j/mikey_nodes.git
$gcs https://github.com/chrisgoringe/cg-use-everywhere.git
$gcs https://github.com/11cafe/comfyui-workspace-manager.git
$gcs https://github.com/crystian/ComfyUI-Crystools.git
$gcs https://github.com/cubiq/ComfyUI_essentials.git
$gcs https://github.com/cubiq/ComfyUI_InstantID.git
$gcs https://github.com/cubiq/ComfyUI_IPAdapter_plus.git
$gcs https://github.com/Fannovel16/comfyui_controlnet_aux.git
$gcs https://github.com/Fannovel16/ComfyUI-Frame-Interpolation.git
$gcs https://github.com/FizzleDorf/ComfyUI_FizzNodes.git
$gcs https://github.com/florestefano1975/comfyui-portrait-master.git
$gcs https://github.com/Gourieff/comfyui-reactor-node.git
$gcs https://github.com/huchenlei/ComfyUI-layerdiffuse.git
$gcs https://github.com/jags111/efficiency-nodes-comfyui.git
$gcs https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet.git
$gcs https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
$gcs https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite.git
$gcs https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
$gcs https://github.com/ltdrdata/ComfyUI-Inspire-Pack.git
$gcs https://github.com/mcmonkeyprojects/sd-dynamic-thresholding.git
$gcs https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git
$gcs https://github.com/pythongosssss/ComfyUI-WD14-Tagger.git
$gcs https://github.com/rgthree/rgthree-comfy.git
$gcs https://github.com/shiimizu/ComfyUI_smZNodes.git
$gcs https://github.com/SLAPaper/ComfyUI-Image-Selector.git
$gcs https://github.com/twri/sdxl_prompt_styler.git

Another note is this image doesn’t bundled deps for WAS Node Suite, because it has some deps version fixed, and is not under active development.
However, the image’s script only install one custom node (ComfyUI-Manager). You can safely install WAS NS via ComfyUI-Manager in a new deployment. If anything conflicts, just delete unwanted custom nodes and .local (or local) folder, and update/try-fix/reinstall custom nodes in ComfyUI-Manager.

Pre-start scripts

You can create your own pre-start script at

./storage/scripts/pre-start.sh

It will run before ComfyUI starts, handy for debugging.

Also, if you need to setup proxy, this script will start before pre-start and download :

./storage/scripts/set-proxy.sh

License

This open source license is written and valid both in Chinese and English, how good is that!