Authoring Multi-Architecture Dockers

If you're building Docker images on an ARM-based machine (like an Apple Silicon Mac), you've probably seen this at some point:

no matching manifest for linux/amd64 in the manifest list entries

Everything works locally.
You push the image.
You deploy to a cloud VM.

Boom. It fails.

Why?

Because Docker images are not automatically cross-architecture.


The Real Issue: ARM vs AMD64

Modern Macs (M1/M2/M3) build images for:

linux/arm64

Most cloud servers (DigitalOcean, AWS, Azure, etc.) run:

linux/amd64

When you run:

docker build -t myapp .

Docker builds for your native architecture only.

So your registry ends up with:

linux/arm64 only

When your amd64 server tries to pull it, Docker can't find a compatible image.


The Fix: Docker Buildx + Multi-Arch Builds

Docker provides buildx to build images for multiple architectures and push a single tag that contains both.

This is what makes your image truly portable.


Step 1 — Create a Multi-Arch Builder (One-Time Setup)

You only need to do this once on your machine:

docker buildx create --use --name multiarch
docker buildx inspect --bootstrap

What this does:

  • Creates a new builder instance
  • Enables cross-compilation support
  • Bootstraps QEMU for emulation
  • Makes it the active builder

You do not need to recreate this every time.


Step 2 — Build and Push Multi-Arch Image

Now build and push in one command:

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t registry.digitalocean.com/dev-hound-containers/dev-hound-blog:latest \
  --push \
  .

What this does:

  • Builds one image for linux/amd64
  • Builds one image for linux/arm64
  • Creates a manifest list
  • Pushes everything to the registry

Your single tag (latest) now contains both architectures.

When a server pulls it, Docker automatically selects the correct one.


If You Only Deploy to AMD64 Servers

If your production environment is amd64 (most VPS providers), you can simplify:

docker buildx build \
  --platform linux/amd64 \
  -t registry.digitalocean.com/dev-hound-containers/dev-hound-blog:latest \
  --push \
  .

This avoids multi-arch complexity and builds only what production needs.


Verify the Architectures in Your Image

To inspect what platforms are included:

docker buildx imagetools inspect registry.digitalocean.com/dev-hound-containers/dev-hound-blog:latest

You should see something like:

Name:      registry.digitalocean.com/...
MediaType: application/vnd.docker.distribution.manifest.list.v2+json

Manifests:
  Platform: linux/amd64
  Platform: linux/arm64

If you only see one architecture, you did not build multi-arch.


What Professionals Do

In production environments, teams typically:

  • Build images in CI (not on laptops)
  • Always target linux/amd64
  • Or build multi-arch automatically
  • Push versioned tags instead of relying on latest

Example with version tagging:

docker buildx build \
  --platform linux/amd64 \
  -t registry.digitalocean.com/dev-hound-containers/dev-hound-blog:2026-02-25-1 \
  --push \
  .

Then deploy that specific tag.


Mental Model Upgrade

Docker gives you:

  • OS portability
  • Environment portability

It does not automatically give you:

  • CPU architecture portability

That requires:

--platform

Once you understand that, ARM vs AMD64 stops being mysterious.


TL;DR

If you're on Apple Silicon and deploying to cloud VMs:

Always build with:

docker buildx build --platform linux/amd64 --push ...

Or build multi-arch if you want full portability.

Welcome to the ARM era.


Published 2026-02-25 >> 2026-02-25