Skip to content

Publish multi-arch images so Cluckwork runs on arm64 (Raspberry Pi and ARM VPS) #995

Description

@mforce

Problem

Every published image is linux/amd64 only. A Raspberry Pi, an Orange Pi or an
ARM VPS cannot run Cluckwork at all — docker run fails to find a matching
manifest. For a small-farm product, a Pi under the desk is a likely deployment
target, so this closes off a real class of user.

Verified against the registry rather than inferred:

ghcr.io/mforce/cluckwork:v0.1.4
  mediaType:    application/vnd.docker.distribution.manifest.v2+json   <- single manifest, not an index
  architecture: amd64
  os:           linux

Cause: ci.yml's publish job does docker tag cluckwork-api:ci then
docker push of the image the image job already built on an ubuntu-latest
(amd64) runner. There is no --platform, no platforms: list and no QEMU setup
anywhere in .github/workflows/. Release promotion (#351) is a server-side
retag of that same digest, so it cannot add an architecture either.

This is smaller than it looks

The Dockerfile is already arm64-ready. #518 pinned the runtime base to the
multi-arch index digest on purpose, and said why:

Pinning an arch-specific digest here would quietly break the other
architecture.

#267 describes all three pins the same way. So #267's digest-pinning invariant
does not need revisiting: the pins resolve per-architecture by design, and the
policy is written down at the top of the Dockerfile. Both bases
(mcr.microsoft.com/dotnet/aspnet:10.0, node:26-alpine) publish arm64, and
.NET 10 targets arm64.

What is missing is only the CI build and push.

Work

The one open design question

Trivy scans the locally --loaded bytes (deliberately, so it examines the
freshly built image rather than a re-pull). --load cannot hold a multi-arch
index. Options, needing a decision rather than a default:

  1. Scan each architecture separately (doubles scan time, full coverage).
  2. Scan amd64 only and accept that an arm64-specific CVE is unscanned.
  3. Scan from the registry after push, which changes what the gate can block.

Costs

Build time roughly doubles, and worse if arm64 compiles under QEMU emulation
rather than a native arm64 runner. Worth measuring both before choosing.

Acceptance

Not covered

Whether to advertise arm64 support publicly is downstream of this. Raised while
preparing the repo for promotion, where "does it run on a Pi?" is a predictable
first question.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions