| # ComfyUI Qwen-Image-Edit base image (H100 / RunPod) | |
| # | |
| # NOTE: published plx1029/comfyui-qwen tags were NOT built from this file — they | |
| # were assembled daemonlessly (v1: crane append on the pod; v2: skopeo + umoci; | |
| # v3: crane append of a /workspace layer on top of v2; v4 and v5: further | |
| # crane appends). This Dockerfile is the reproducible equivalent: building it | |
| # on any machine with Docker produces the same setup. | |
| # | |
| # Build from the REPO ROOT (context needs download_missing_models.sh + workflows/ | |
| # + start_comfy + claude_start.sh + apply_patches.sh): | |
| # docker build -t plx1029/comfyui-qwen:v7 -f docker/Dockerfile . | |
| # docker push plx1029/comfyui-qwen:v7 | |
| # | |
| # No secrets are baked into this image (it is public). The model-download | |
| # script prompts for your Hugging Face token at runtime (or reads $HF_TOKEN). | |
| # | |
| # v3: EVERYTHING lives in /workspace — /workspace/ComfyUI, /workspace/workflows, | |
| # /workspace/download_missing_models.sh. A compressed seed of the /workspace | |
| # payload is kept at /opt/workspace-seed.tar.gz so that when a network volume | |
| # is mounted over /workspace (shadowing the baked files), seed-workspace.sh | |
| # restores the missing pieces without touching anything already on the volume. | |
| # | |
| # v4: ComfyUI no longer auto-starts (COMFY_AUTOSTART=true re-enables); | |
| # download_missing_models.sh + README.md are re-fetched from the HF repo at | |
| # boot. | |
| # | |
| # v5: the boot refresh lives in refresh-workspace.sh and now also MIRRORS | |
| # workflows/ from hf.co/aleph65/ComfyUI (deletions included; uses | |
| # HUGGING_FACE_ACCESS_TOKEN or HF_TOKEN if set; WORKSPACE_REFRESH=false | |
| # disables). Also: interactive `claude` is aliased to | |
| # `IS_SANDBOX=1 claude --dangerously-skip-permissions`. | |
| # | |
| # v6: two launcher scripts baked into /workspace and re-fetched from the HF | |
| # repo at boot (via refresh-workspace.sh) — `start_comfy` (frees port 7865 then | |
| # runs ComfyUI with the manager) and `claude_start.sh` (IS_SANDBOX=1 claude | |
| # --dangerously-skip-permissions). | |
| # | |
| # v7: apply_patches.sh baked in + run at build, and re-run at launch by | |
| # start_comfy (so existing pods self-heal off the HF copy). Fixes ComfyUI | |
| # #14573 — the comfy-aimdo/DynamicVRAM sampler hang at "Model Initializing" | |
| # (and its slow loads) by patching model_management.py's NVIDIA | |
| # MIN_WEIGHT_MEMORY_RATIO 0.0 -> 0.4. With the patch, DynamicVRAM is safe, so | |
| # start_comfy no longer disables it. Remove the patch once #14573 lands upstream. | |
| FROM runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404 | |
| ARG COMFYUI_COMMIT=35c1470935044be5610a81d46e57922a8a598c6c | |
| ARG RGTHREE_COMMIT=27b4f4cdcf3b127c29d5d8135ac1536ecbd4c383 | |
| # ComfyUI pinned to the exact commit, IN /workspace; torch stack already in | |
| # base -> only light deps install | |
| RUN git clone https://github.com/comfyanonymous/ComfyUI.git /workspace/ComfyUI && \ | |
| cd /workspace/ComfyUI && git checkout ${COMFYUI_COMMIT} && \ | |
| pip install -r requirements.txt | |
| # v7: apply local core patches upstream hasn't merged (ComfyUI #14573 aimdo | |
| # hang). Idempotent; start_comfy also re-runs it at launch from the HF copy. | |
| COPY apply_patches.sh /workspace/apply_patches.sh | |
| RUN chmod +x /workspace/apply_patches.sh && bash /workspace/apply_patches.sh | |
| # Custom nodes: rgthree (Power Lora Loader) + ComfyUI-Manager | |
| RUN git clone https://github.com/rgthree/rgthree-comfy.git /workspace/ComfyUI/custom_nodes/rgthree-comfy && \ | |
| cd /workspace/ComfyUI/custom_nodes/rgthree-comfy && git checkout ${RGTHREE_COMMIT} && \ | |
| pip install comfyui-manager==4.2.2 | |
| # Hugging Face hub tooling for fast model downloads (hf_transfer is best-effort: | |
| # hub >= 1.x ships fast Xet downloads built in and dropped the extra) | |
| RUN pip install -U "huggingface_hub[hf_transfer]" || pip install -U huggingface_hub && \ | |
| (pip install hf_transfer || true) | |
| # Claude Code CLI, on PATH for all shells, with bypassPermissions as the | |
| # default permission mode (this is a throwaway pod environment) | |
| RUN curl -fsSL https://claude.ai/install.sh | bash && \ | |
| ln -sf /root/.local/bin/claude /usr/local/bin/claude && \ | |
| mkdir -p /root/.claude && \ | |
| printf '{\n "permissions": {\n "defaultMode": "bypassPermissions"\n }\n}\n' > /root/.claude/settings.json && \ | |
| printf '{\n "bypassPermissionsModeAccepted": true\n}\n' > /root/.claude.json | |
| ENV PATH="/root/.local/bin:${PATH}" | |
| # Interactive shells: `claude` always runs sandboxed with permissions skipped | |
| # (/root/.bashrc from the base image sources ~/.bash_aliases when present) | |
| COPY docker/bash_aliases /root/.bash_aliases | |
| # Manager config baked in: security_level=weak, network_mode=personal_cloud | |
| COPY docker/config.ini /workspace/ComfyUI/user/__manager/config.ini | |
| COPY docker/comfy.settings.json /workspace/ComfyUI/user/default/comfy.settings.json | |
| COPY workflows/ /workspace/ComfyUI/user/default/workflows/ | |
| # Workflows + model downloader live in /workspace too. The downloader picks | |
| # workflows, finds their models in the HF repo (aleph65/ComfyUI), and downloads | |
| # the missing ones into /workspace/ComfyUI/models/. Prompts for the HF token | |
| # (or reads $HF_TOKEN). Kept on PATH via a symlink. | |
| COPY workflows/ /workspace/workflows/ | |
| COPY download_missing_models.sh /workspace/download_missing_models.sh | |
| RUN chmod +x /workspace/download_missing_models.sh && \ | |
| ln -sf /workspace/download_missing_models.sh /usr/local/bin/download_missing_models.sh | |
| # v6: launcher scripts in /workspace. start_comfy kills whatever holds port | |
| # 7865, applies core patches, then runs ComfyUI (--enable-manager); | |
| # claude_start.sh launches Claude Code sandboxed. refresh-workspace.sh re-pulls | |
| # both from the HF repo at boot. | |
| COPY start_comfy /workspace/start_comfy | |
| COPY claude_start.sh /workspace/claude_start.sh | |
| RUN chmod +x /workspace/start_comfy /workspace/claude_start.sh | |
| # Seed tarball: restores /workspace when a network volume shadows it | |
| RUN tar -czf /opt/workspace-seed.tar.gz -C /workspace ComfyUI workflows download_missing_models.sh start_comfy claude_start.sh apply_patches.sh | |
| # Startup: seed /workspace if needed, refresh workflows + downloader from the | |
| # HF repo (v5). ComfyUI does NOT auto-start (v4 default) — run `comfy` | |
| # manually or set COMFY_AUTOSTART=true in the pod env. | |
| COPY docker/seed-workspace.sh /usr/local/bin/seed-workspace.sh | |
| COPY docker/refresh-workspace.sh /usr/local/bin/refresh-workspace.sh | |
| COPY docker/comfy /usr/local/bin/comfy | |
| COPY docker/start-comfy.sh /start-comfy.sh | |
| RUN chmod +x /usr/local/bin/comfy /usr/local/bin/seed-workspace.sh /usr/local/bin/refresh-workspace.sh /start-comfy.sh | |
| EXPOSE 7865 | |
| CMD | |