arm64 without QEMU
Multi-architecture image builds
Build each architecture on native hardware and publish one manifest list. No emulation penalty.
Native everywhere
amd64 builds on amd64, arm64 builds on arm64. The way it should have been.
One manifest
Digests merge into a single tag consumers pull normally.
5×–40× faster
Exactly how much depends on how much your image compiles.
QEMU emulation is the default path for multi-arch builds and it is the reason so many teams quietly dropped arm64 support. Emulating an entire compiler toolchain is as slow as it sounds.
Common questions
- Why is QEMU so much slower?
- It translates every arm64 instruction into x64 at runtime, so the penalty scales with how many instructions your build executes. A file-copy image is about 3× slower; a Rust or C++ build is 35–40× slower.
- How do I publish one tag for both architectures?
- Build each architecture on its own native runner, push by digest, then merge with docker buildx imagetools create. Consumers pull the tag normally.
- Do I need separate caches per architecture?
- Yes, and they are separate automatically. Include runner.arch in any actions/cache key too, or an x64 cache restored onto arm64 produces confusing linker errors rather than a clean miss.
Your next build could be twice as fast, at half the price
Start free. Migrating away is the same one line, and we publish that diff too.