Skip to content

Commit e5971a4

Browse files
jamesbrinkclaude
andauthored
feat: Add multi-arch Docker builds and auto-download template inputs (#8)
* feat: Add multi-arch Docker builds and auto-download template inputs Multi-architecture Docker support: - Build CPU images for both amd64 and arm64 (Apple Silicon compatible) - CUDA images remain x86_64 only (NVIDIA requirement) - Use QEMU emulation in CI for cross-architecture builds - Create multi-arch manifests for seamless pulling on any platform - Update README with Apple Silicon Docker instructions Auto-download workflow template input files: - Add template_inputs.sh script to download example images on startup - Fetch manifest from GitHub workflow_templates repository - Non-blocking download (doesn't fail startup if network unavailable) - Cache manifest for 7 days to minimize network requests - Skip existing files for faster subsequent startups - Add curl and jq to runtime PATH via makeWrapper 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: Address code review security and robustness concerns Security improvements in template_inputs.sh: - Add path traversal validation to reject file paths containing ".." - Add file size validation (50MB limit) to prevent DoS attacks - Add file type validation using MIME type checking - Validate JSON manifest structure before processing Robustness improvements: - Capture and display actual curl error messages for debugging - Add atomic write pattern with empty file validation - Platform-agnostic file size detection (macOS/Linux compatible) - Remove unused display_name variable (shellcheck warning) CI/CD improvements in docker.yml: - Add manifest existence verification before creating multi-arch manifests - Use variables for architecture-specific tags for consistency - Add clear error messages when builds fail 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 8cc2842 commit e5971a4

File tree

6 files changed

+456
-61
lines changed

6 files changed

+456
-61
lines changed

.github/workflows/docker.yml

Lines changed: 176 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,33 @@ env:
2828
IMAGE_NAME: ${{ github.repository }}
2929

3030
jobs:
31-
build-and-push:
31+
build:
3232
runs-on: ubuntu-latest
3333
permissions:
3434
contents: read
3535
packages: write
3636
id-token: write
3737

3838
strategy:
39+
fail-fast: false
3940
matrix:
40-
variant:
41-
- name: cpu
41+
include:
42+
# CPU variants for both architectures
43+
- variant: cpu
44+
arch: x86_64-linux
4245
nix_target: dockerImage
46+
platform: linux/amd64
4347
tag_suffix: ''
44-
- name: cuda
48+
- variant: cpu
49+
arch: aarch64-linux
50+
nix_target: dockerImage
51+
platform: linux/arm64
52+
tag_suffix: ''
53+
# CUDA only for x86_64 (NVIDIA CUDA not available for ARM)
54+
- variant: cuda
55+
arch: x86_64-linux
4556
nix_target: dockerImageCuda
57+
platform: linux/amd64
4658
tag_suffix: '-cuda'
4759

4860
steps:
@@ -51,13 +63,22 @@ jobs:
5163
with:
5264
fetch-depth: 0
5365

66+
- name: Set up QEMU
67+
uses: docker/setup-qemu-action@v3
68+
with:
69+
platforms: arm64
70+
71+
- name: Set up Docker Buildx
72+
uses: docker/setup-buildx-action@v3
73+
5474
- name: Install Nix
5575
uses: cachix/install-nix-action@v31
5676
with:
5777
nix_path: nixpkgs=channel:nixos-unstable
5878
extra_nix_config: |
5979
experimental-features = nix-command flakes
6080
accept-flake-config = true
81+
extra-platforms = aarch64-linux
6182
6283
- name: Setup Cachix
6384
uses: cachix/cachix-action@v15
@@ -81,80 +102,193 @@ jobs:
81102
VERSION=$(grep -m1 'comfyuiVersion = ' flake.nix | sed 's/.*"\(.*\)".*/\1/')
82103
echo "version=$VERSION" >> $GITHUB_OUTPUT
83104
84-
# Generate Docker tags
85-
TAGS=""
105+
# Determine architecture suffix for intermediate tags
106+
if [[ "${{ matrix.arch }}" == "aarch64-linux" ]]; then
107+
ARCH_SUFFIX="-arm64"
108+
else
109+
ARCH_SUFFIX="-amd64"
110+
fi
111+
echo "arch_suffix=$ARCH_SUFFIX" >> $GITHUB_OUTPUT
112+
113+
# Generate Docker tags for this specific architecture
86114
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
87-
TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest${{ matrix.variant.tag_suffix }}"
88-
TAGS="$TAGS,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${VERSION}${{ matrix.variant.tag_suffix }}"
115+
TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest${{ matrix.tag_suffix }}${ARCH_SUFFIX}"
89116
elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
90117
TAG_VERSION=${GITHUB_REF#refs/tags/v}
91-
TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}${{ matrix.variant.tag_suffix }}"
92-
TAGS="$TAGS,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest${{ matrix.variant.tag_suffix }}"
118+
TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}${{ matrix.tag_suffix }}${ARCH_SUFFIX}"
93119
else
94-
TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pr-${{ github.event.pull_request.number }}${{ matrix.variant.tag_suffix }}"
120+
TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pr-${{ github.event.pull_request.number }}${{ matrix.tag_suffix }}${ARCH_SUFFIX}"
95121
fi
96-
echo "tags=$TAGS" >> $GITHUB_OUTPUT
97-
98-
# Generate labels
99-
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
100-
echo "revision=${{ github.sha }}" >> $GITHUB_OUTPUT
122+
echo "tag=$TAG" >> $GITHUB_OUTPUT
101123
102124
- name: Build Docker image with Nix
103125
run: |
104-
echo "Building ${{ matrix.variant.name }} variant..."
105-
nix build .#${{ matrix.variant.nix_target }} --print-build-logs
126+
echo "Building ${{ matrix.variant }} variant for ${{ matrix.arch }}..."
127+
nix build .#packages.${{ matrix.arch }}.${{ matrix.nix_target }} --print-build-logs
106128
107129
# Load the image into Docker
108130
docker load < result
109131
110132
# Show loaded image
111133
docker images | grep comfy-ui
112134
113-
- name: Tag and push Docker images
135+
- name: Tag and push Docker image
114136
if: github.event_name != 'pull_request'
115137
run: |
116138
# Get the image ID from the loaded image
117-
if [[ "${{ matrix.variant.name }}" == "cuda" ]]; then
139+
if [[ "${{ matrix.variant }}" == "cuda" ]]; then
118140
IMAGE_ID=$(docker images comfy-ui:cuda -q | head -n1)
119141
else
120142
IMAGE_ID=$(docker images comfy-ui:latest -q | head -n1)
121143
fi
122144
123-
# Tag and push each tag
124-
IFS=',' read -ra TAG_ARRAY <<< "${{ steps.meta.outputs.tags }}"
125-
for tag in "${TAG_ARRAY[@]}"; do
126-
echo "Tagging and pushing: $tag"
127-
docker tag "$IMAGE_ID" "$tag"
128-
docker push "$tag"
145+
echo "Tagging and pushing: ${{ steps.meta.outputs.tag }}"
146+
docker tag "$IMAGE_ID" "${{ steps.meta.outputs.tag }}"
147+
docker push "${{ steps.meta.outputs.tag }}"
148+
149+
- name: Generate build summary
150+
run: |
151+
echo "## Docker Image Built (${{ matrix.variant }} - ${{ matrix.arch }})" >> $GITHUB_STEP_SUMMARY
152+
echo "" >> $GITHUB_STEP_SUMMARY
153+
echo "**Version:** ${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
154+
echo "**Variant:** ${{ matrix.variant }}" >> $GITHUB_STEP_SUMMARY
155+
echo "**Architecture:** ${{ matrix.arch }}" >> $GITHUB_STEP_SUMMARY
156+
echo "**Platform:** ${{ matrix.platform }}" >> $GITHUB_STEP_SUMMARY
157+
158+
# Create and push multi-arch manifests after all builds complete
159+
create-manifests:
160+
needs: build
161+
runs-on: ubuntu-latest
162+
if: github.event_name != 'pull_request'
163+
permissions:
164+
packages: write
165+
166+
steps:
167+
- name: Checkout repository
168+
uses: actions/checkout@v4
169+
170+
- name: Log in to Container Registry
171+
uses: docker/login-action@v3
172+
with:
173+
registry: ${{ env.REGISTRY }}
174+
username: ${{ github.actor }}
175+
password: ${{ secrets.GITHUB_TOKEN }}
176+
177+
- name: Extract metadata
178+
id: meta
179+
run: |
180+
VERSION=$(grep -m1 'comfyuiVersion = ' flake.nix | sed 's/.*"\(.*\)".*/\1/')
181+
echo "version=$VERSION" >> $GITHUB_OUTPUT
182+
183+
- name: Create and push multi-arch manifest (CPU)
184+
run: |
185+
# Determine tags based on ref
186+
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
187+
MANIFEST_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
188+
VERSION_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}"
189+
AMD64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-amd64"
190+
ARM64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-arm64"
191+
elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
192+
TAG_VERSION=${GITHUB_REF#refs/tags/v}
193+
MANIFEST_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}"
194+
VERSION_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
195+
AMD64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}-amd64"
196+
ARM64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}-arm64"
197+
fi
198+
199+
# Verify both architecture images exist before creating manifest
200+
echo "Verifying architecture-specific images exist..."
201+
for arch_tag in "$AMD64_TAG" "$ARM64_TAG"; do
202+
if ! docker manifest inspect "$arch_tag" &>/dev/null; then
203+
echo "ERROR: Required image not found: $arch_tag"
204+
echo "This likely means the build job for this architecture failed."
205+
exit 1
206+
fi
207+
echo "Found: $arch_tag"
129208
done
130209
131-
- name: Generate image summary
132-
if: github.event_name != 'pull_request'
210+
# Create multi-arch manifest for CPU variant
211+
echo "Creating multi-arch manifest: $MANIFEST_TAG"
212+
docker manifest create "$MANIFEST_TAG" \
213+
"$AMD64_TAG" \
214+
"$ARM64_TAG"
215+
216+
docker manifest annotate "$MANIFEST_TAG" "$AMD64_TAG" --arch amd64
217+
docker manifest annotate "$MANIFEST_TAG" "$ARM64_TAG" --arch arm64
218+
219+
docker manifest push "$MANIFEST_TAG"
220+
221+
# Also push version tag if on main
222+
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
223+
echo "Creating multi-arch manifest: $VERSION_TAG"
224+
docker manifest create "$VERSION_TAG" "$AMD64_TAG" "$ARM64_TAG"
225+
226+
docker manifest annotate "$VERSION_TAG" "$AMD64_TAG" --arch amd64
227+
docker manifest annotate "$VERSION_TAG" "$ARM64_TAG" --arch arm64
228+
229+
docker manifest push "$VERSION_TAG"
230+
fi
231+
232+
- name: Create and push CUDA manifest (x86_64 only)
233+
run: |
234+
# CUDA is only available for x86_64, so no multi-arch manifest needed
235+
# Just create alias tags for consistency
236+
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
237+
CUDA_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda"
238+
VERSION_CUDA_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}-cuda"
239+
CUDA_AMD64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda-amd64"
240+
elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
241+
TAG_VERSION=${GITHUB_REF#refs/tags/v}
242+
CUDA_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}-cuda"
243+
VERSION_CUDA_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda"
244+
CUDA_AMD64_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${TAG_VERSION}-cuda-amd64"
245+
fi
246+
247+
# Verify CUDA image exists before creating alias tags
248+
echo "Verifying CUDA image exists..."
249+
if ! docker manifest inspect "$CUDA_AMD64_TAG" &>/dev/null; then
250+
echo "ERROR: Required CUDA image not found: $CUDA_AMD64_TAG"
251+
echo "This likely means the CUDA build job failed."
252+
exit 1
253+
fi
254+
echo "Found: $CUDA_AMD64_TAG"
255+
256+
# Pull and retag for alias
257+
docker pull "$CUDA_AMD64_TAG"
258+
259+
docker tag "$CUDA_AMD64_TAG" "$CUDA_TAG"
260+
docker push "$CUDA_TAG"
261+
262+
docker tag "$CUDA_AMD64_TAG" "$VERSION_CUDA_TAG"
263+
docker push "$VERSION_CUDA_TAG"
264+
265+
- name: Generate manifest summary
133266
run: |
134-
echo "## Docker Image Published (${{ matrix.variant.name }})" >> $GITHUB_STEP_SUMMARY
267+
echo "## Multi-Architecture Docker Images Published" >> $GITHUB_STEP_SUMMARY
135268
echo "" >> $GITHUB_STEP_SUMMARY
136269
echo "**Version:** ${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
137-
echo "**Variant:** ${{ matrix.variant.name }}" >> $GITHUB_STEP_SUMMARY
138270
echo "" >> $GITHUB_STEP_SUMMARY
139-
echo "### Pull Commands:" >> $GITHUB_STEP_SUMMARY
271+
echo "### CPU (Multi-arch: amd64 + arm64)" >> $GITHUB_STEP_SUMMARY
140272
echo '```bash' >> $GITHUB_STEP_SUMMARY
141-
IFS=',' read -ra TAG_ARRAY <<< "${{ steps.meta.outputs.tags }}"
142-
for tag in "${TAG_ARRAY[@]}"; do
143-
echo "docker pull $tag" >> $GITHUB_STEP_SUMMARY
144-
done
273+
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
145274
echo '```' >> $GITHUB_STEP_SUMMARY
146275
echo "" >> $GITHUB_STEP_SUMMARY
147-
echo "### Run Command:" >> $GITHUB_STEP_SUMMARY
276+
echo "### CUDA (amd64 only)" >> $GITHUB_STEP_SUMMARY
148277
echo '```bash' >> $GITHUB_STEP_SUMMARY
149-
if [[ "${{ matrix.variant.name }}" == "cuda" ]]; then
150-
echo "docker run --gpus all -p 8188:8188 -v \$PWD/data:/data ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda" >> $GITHUB_STEP_SUMMARY
151-
else
152-
echo "docker run -p 8188:8188 -v \$PWD/data:/data ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
153-
fi
278+
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda" >> $GITHUB_STEP_SUMMARY
279+
echo '```' >> $GITHUB_STEP_SUMMARY
280+
echo "" >> $GITHUB_STEP_SUMMARY
281+
echo "### Run Commands" >> $GITHUB_STEP_SUMMARY
282+
echo '```bash' >> $GITHUB_STEP_SUMMARY
283+
echo "# CPU (works on both amd64 and arm64)" >> $GITHUB_STEP_SUMMARY
284+
echo "docker run -p 8188:8188 -v \$PWD/data:/data ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
285+
echo "" >> $GITHUB_STEP_SUMMARY
286+
echo "# CUDA (amd64 only)" >> $GITHUB_STEP_SUMMARY
287+
echo "docker run --gpus all -p 8188:8188 -v \$PWD/data:/data ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-cuda" >> $GITHUB_STEP_SUMMARY
154288
echo '```' >> $GITHUB_STEP_SUMMARY
155289
156290
update-description:
157-
needs: build-and-push
291+
needs: create-manifests
158292
runs-on: ubuntu-latest
159293
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
160294
permissions:

CLAUDE.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,13 @@ custom_nodes/ - Persistent custom node installations
104104
#### Docker Image Publishing (`.github/workflows/docker.yml`)
105105
- **Purpose**: Automatically build and publish Docker images to GitHub Container Registry
106106
- **Triggers**: Push to main, version tags (v*), pull requests
107-
- **Build Matrix**: Both CPU and CUDA variants built in parallel
107+
- **Multi-Architecture**: CPU images built for both amd64 and arm64 (via QEMU emulation)
108+
- **Build Matrix**: CPU (multi-arch) and CUDA (x86_64 only) variants built in parallel
108109
- **Outputs**: Images published to `ghcr.io/utensils/comfyui-nix`
109110
- **Tags**:
110111
- Main branch: `latest`, `X.Y.Z` (from flake.nix)
111112
- Version tags: `vX.Y.Z`, `latest`
113+
- Architecture-specific: `latest-amd64`, `latest-arm64`
112114
- Pull requests: `pr-N` (build only, no push)
113115
- **Caching**: Uses Cachix for Nix build caching (requires `CACHIX_AUTH_TOKEN` secret)
114116

@@ -126,7 +128,8 @@ custom_nodes/ - Persistent custom node installations
126128
- **Location**: GitHub Container Registry (ghcr.io)
127129
- **Public Access**: All images are publicly readable
128130
- **Namespace**: `ghcr.io/utensils/comfyui-nix`
129-
- **Variants**: CPU (`:latest`) and CUDA (`:latest-cuda`)
131+
- **Variants**: CPU (`:latest`, multi-arch) and CUDA (`:latest-cuda`, x86_64 only)
132+
- **Architectures**: amd64 (x86_64) and arm64 (aarch64/Apple Silicon) for CPU images
130133

131134
## Code Style Guidelines
132135

README.md

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -246,23 +246,23 @@ This structure ensures clear separation of concerns and makes the codebase easie
246246

247247
## Docker Support
248248

249-
This flake includes Docker support for running ComfyUI in a containerized environment while preserving all functionality. Both CPU and CUDA-enabled GPU images are available.
249+
This flake includes Docker support for running ComfyUI in a containerized environment while preserving all functionality. Multi-architecture images are available for both x86_64 (amd64) and ARM64 (aarch64) platforms.
250250

251251
### Pre-built Images (GitHub Container Registry)
252252

253253
Pre-built Docker images are automatically published to GitHub Container Registry on every release. This is the easiest way to get started:
254254

255-
#### Pull and Run CPU Version
255+
#### Pull and Run CPU Version (Multi-arch: amd64 + arm64)
256256

257257
```bash
258-
# Pull the latest CPU version
258+
# Pull the latest CPU version (automatically selects correct architecture)
259259
docker pull ghcr.io/utensils/comfyui-nix:latest
260260

261261
# Run the container
262262
docker run -p 8188:8188 -v "$PWD/data:/data" ghcr.io/utensils/comfyui-nix:latest
263263
```
264264

265-
#### Pull and Run CUDA (GPU) Version
265+
#### Pull and Run CUDA (GPU) Version (x86_64 only)
266266

267267
```bash
268268
# Pull the latest CUDA version
@@ -274,13 +274,31 @@ docker run --gpus all -p 8188:8188 -v "$PWD/data:/data" ghcr.io/utensils/comfyui
274274

275275
#### Available Tags
276276

277-
- `latest` - Latest CPU version from main branch
278-
- `latest-cuda` - Latest CUDA version from main branch
279-
- `X.Y.Z` - Specific version (CPU)
280-
- `X.Y.Z-cuda` - Specific version (CUDA)
277+
- `latest` - Latest CPU version, multi-arch (amd64 + arm64)
278+
- `latest-cuda` - Latest CUDA version (x86_64/amd64 only)
279+
- `latest-amd64` - Latest CPU version for x86_64
280+
- `latest-arm64` - Latest CPU version for ARM64
281+
- `X.Y.Z` - Specific version (CPU, multi-arch)
282+
- `X.Y.Z-cuda` - Specific version (CUDA, x86_64 only)
281283

282284
Visit the [packages page](https://github.com/utensils/comfyui-nix/pkgs/container/comfyui-nix) to see all available versions.
283285

286+
### Apple Silicon (M1/M2/M3) Support
287+
288+
The `latest` and `latest-arm64` tags work on Apple Silicon Macs via Docker Desktop:
289+
290+
```bash
291+
# Works on Apple Silicon Macs
292+
docker run -p 8188:8188 -v "$PWD/data:/data" ghcr.io/utensils/comfyui-nix:latest
293+
```
294+
295+
**Important**: Docker containers on macOS cannot access the Metal GPU (MPS). The Docker image runs **CPU-only** on Apple Silicon. For GPU acceleration on Apple Silicon, use `nix run` directly instead of Docker:
296+
297+
```bash
298+
# For GPU acceleration on Apple Silicon, use nix directly (not Docker)
299+
nix run github:utensils/comfyui-nix
300+
```
301+
284302
### Building the Docker Image Locally
285303

286304
#### CPU Version
@@ -374,11 +392,13 @@ The Docker image follows the same modular structure as the regular installation,
374392
Docker images are automatically built and published to GitHub Container Registry via GitHub Actions:
375393

376394
- **Trigger events**: Push to main branch, version tags (v*), and pull requests
377-
- **Build matrix**: Both CPU and CUDA variants are built in parallel
395+
- **Multi-architecture**: CPU images built for both amd64 and arm64 (via QEMU emulation)
396+
- **Build matrix**: CPU (multi-arch) and CUDA (x86_64 only) variants built in parallel
378397
- **Tagging strategy**:
379398
- Main branch pushes: `latest` and `X.Y.Z` (version from flake.nix)
380399
- Version tags: `vX.Y.Z` and `latest`
381400
- Pull requests: `pr-N` (for testing, not pushed to registry)
401+
- Architecture-specific: `latest-amd64`, `latest-arm64`
382402
- **Registry**: All images are publicly accessible at `ghcr.io/utensils/comfyui-nix`
383403
- **Build cache**: Nix builds are cached using Cachix for faster CI runs
384404

0 commit comments

Comments
 (0)