# 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 ["/start-comfy.sh"]