Publish multi-arch Docker image (amd64 + arm64)#1253
Merged
Conversation
The planetscale/pscale Docker image was only published for linux/amd64, which forced arm64 users (Apple Silicon, Graviton, etc.) to run it under emulation. The linux/arm64 binary is already produced by goreleaser, so this wires that binary into a second Docker build and combines the two arch-specific tags into a multi-arch manifest. Also adds docker/setup-qemu-action and docker/setup-buildx-action to the release workflow so the host has buildx + QEMU registered before the goreleaser container invokes `docker buildx` against the mounted socket. Fixes #1252
goreleaser with `use: buildx` requires an active docker-container builder, but goreleaser runs inside the goreleaser-cross container while setup-buildx-action configures the builder on the host — the buildx client config at ~/.docker/buildx/ is not shared, so the in-container buildx CLI starts with only the default docker driver and cannot satisfy --platform builds the way goreleaser invokes them. Add an entrypoint script that creates and selects a docker-container buildx builder on first invocation, so goreleaser sees a proper builder when it runs. setup-qemu-action is kept on the host (binfmt handlers are kernel-level and inherited), but setup-buildx-action is dropped as it has no effect on the container's buildx state.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 7abdf80. Configure here.
The previous commit replaced the goreleaser-cross base entrypoint, which also handled docker login (via DOCKER_CREDS_FILE, passed by the Makefile), GPG key import, git safe.directory, and CC/CXX setup for CGO. Without that setup, the release would fail to push images to Docker Hub. Move the base entrypoint to /base-entrypoint.sh and have our wrapper exec it after configuring buildx. Also restore tini as PID 1 to match the base image's signal handling.
dgraham
approved these changes
Apr 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
dockersblock into two arch-specific builds (amd64 + arm64) and combines them with adocker_manifestsblock soplanetscale/pscale:latestandplanetscale/pscale:{{ .Tag }}become multi-arch manifests.docker/setup-qemu-action+docker/setup-buildx-actionto the release workflow so the host has QEMU emulators and a buildx builder registered before goreleaser invokesdocker buildxover the mounted socket.Why
The image has been amd64-only since it was first published, which forces arm64 users (Apple Silicon laptops, Graviton hosts, arm64 CI runners) to run it under emulation — slow, and it breaks entirely in environments that block cross-arch execution. The linux/arm64 binary has been produced by goreleaser for a while, so the binary is essentially free; only the Docker publish path was missing.
Dockerfile.goreleaseris already arch-neutral (justCOPYs the binary intoubuntu:noble, which has both amd64 and arm64 images), so no Dockerfile changes were needed.Fixes #1252