Build the amd64 image with QEMU 9.2.2 and only emulate the final stage
docker / test (8.5) (push) Successful in 2m20s
linter / quality (push) Successful in 1m5s
tests / ci (8.5) (push) Successful in 2m16s
docker / build-and-push (push) Successful in 20m13s
docker / release (push) Skipped

QEMU 8.x crashes running x86_64 programs on an arm64 host (QEMU issue
2168), which the 8.1.5 pin walked into, and 10.2 segfaults on the runner
as well; 9.2.2 runs node, composer and install-php-extensions on the
runner's host. The Composer and npm stages now build on the build
machine's platform: their output is the same for every target, so a
multi-arch build runs them once and natively.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
This commit is contained in:
Andreas Reinhold / reini
2026-09-13 15:52:58 +02:00
co-authored by Claude Opus 5
parent 21bea9646d
commit 09e24ade14
2 changed files with 11 additions and 6 deletions
+5 -3
View File
@@ -67,12 +67,14 @@ jobs:
- name: Checkout code
uses: actions/checkout@v6
# The runner is an arm64 server, so the amd64 image is emulated. On its 6.8 kernel, recent
# QEMU builds segfault compiling PHP extensions (docker/buildx#3170); QEMU 8 is pinned.
# The runner is an arm64 server, so the amd64 image's final stage is emulated. QEMU 8.x
# crashes running x86_64 programs on an arm64 host (QEMU issue 2168, "QEMU internal
# SIGSEGV {code=MAPERR, addr=0x20}") and 10.2 segfaults on this runner too; 9.2.2 was
# checked on the runner's host: node, composer and install-php-extensions all run.
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:qemu-v8.1.5
image: tonistiigi/binfmt:qemu-v9.2.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
+6 -3
View File
@@ -1,7 +1,9 @@
# ============================================
# Stage 1: Install PHP dependencies
# ============================================
FROM composer:2 AS vendor
# Built on the build machine's own platform: vendor/ is plain PHP, the same for every target, so a
# multi-arch build runs it once and never under emulation.
FROM --platform=$BUILDPLATFORM composer:2 AS vendor
WORKDIR /app
@@ -21,8 +23,9 @@ RUN composer dump-autoload --optimize --no-dev
# ============================================
# Stage 2: Build frontend assets
# ============================================
# After Composer: the stylesheet and script import Livewire Material from vendor/.
FROM node:24-alpine AS assets
# After Composer: the stylesheet and script import Livewire Material from vendor/. On the build
# machine's platform too: the output is CSS and JavaScript, whatever the target.
FROM --platform=$BUILDPLATFORM node:24-alpine AS assets
WORKDIR /app