This error occurs when Docker Buildx attempts to push a multi-platform image but the target registry or driver doesn't support the platform manifest. Common causes include using the default Docker driver (which lacks multi-platform support), missing QEMU emulation for cross-architecture builds, or registry limitations.
This error indicates that Docker Buildx failed to push an image because the target platform is not supported by either the builder driver, the registry, or the build configuration. The "unsupported platform" message specifically points to a mismatch between what you're trying to build/push and what your current setup can handle. Docker Buildx is an extended build command that supports advanced features like multi-platform builds. However, the default Docker driver that comes with Docker Desktop and Docker Engine only supports building images for your host's native architecture. When you try to build for multiple platforms (like linux/amd64 and linux/arm64 simultaneously), the default driver fails. The solution typically involves switching to a different builder driver (like docker-container) that supports multi-platform builds, installing QEMU for cross-platform emulation, or ensuring your registry supports manifest lists for multi-architecture images.
The default Docker driver doesn't support multi-platform builds. Create a new builder that uses the docker-container driver:
# Create and switch to a new builder with multi-platform support
docker buildx create --name multiplatform-builder --driver docker-container --use
# Verify the builder is active and supports multiple platforms
docker buildx inspect --bootstrap
# List all builders to confirm
docker buildx lsThe docker-container driver runs builds inside a container, enabling features like multi-platform builds. The --bootstrap flag ensures the builder is ready before use.
Building images for architectures different from your host requires QEMU emulation:
# Install QEMU using Docker's official image (works on any Linux/Docker Desktop)
docker run --privileged --rm tonistiigi/binfmt --install all
# Verify QEMU handlers are registered
docker run --privileged --rm tonistiigi/binfmt
# On Ubuntu/Debian, you can also install via apt
sudo apt-get update
sudo apt-get install -y qemu-user-static binfmt-support
# Check available emulation targets
ls /proc/sys/fs/binfmt_misc/qemu-*Docker Desktop includes QEMU by default, but standalone Docker Engine installations need manual setup. The binfmt_misc registration allows the kernel to transparently run binaries for foreign architectures.
Multi-platform images cannot be loaded into the local Docker daemon; they must be pushed to a registry:
# WRONG: --load doesn't work with multi-platform
docker buildx build --platform linux/amd64,linux/arm64 --load -t myimage:latest .
# Error: docker exporter does not currently support exporting manifest lists
# CORRECT: Push directly to registry
docker buildx build --platform linux/amd64,linux/arm64 --push -t myregistry/myimage:latest .
# Or push to local registry for testing
docker run -d -p 5000:5000 --name registry registry:2
docker buildx build --platform linux/amd64,linux/arm64 --push -t localhost:5000/myimage:latest .The Docker daemon image store only supports single-architecture images. Multi-platform manifest lists require a registry.
Docker Desktop can use containerd as the image store, which supports multi-platform images locally:
1. Open Docker Desktop
2. Go to Settings (gear icon)
3. Navigate to General or Features in development
4. Enable "Use containerd for storing and pulling images"
5. Click Apply & restart
After enabling:
# Now you can use --load with multi-platform (on supported setups)
docker buildx build --platform linux/amd64,linux/arm64 --load -t myimage:latest .Note: If this setting causes issues, you can disable it and use the --push workflow instead.
Ensure your builder instance supports the platforms you're targeting:
# Inspect current builder capabilities
docker buildx inspect --bootstrap
# Expected output includes:
# Platforms: linux/amd64, linux/amd64/v2, linux/arm64, linux/arm/v7, ...
# If platforms are missing, recreate with explicit platform support
docker buildx create --name mybuilder --driver docker-container \
--platform linux/amd64,linux/arm64,linux/arm/v7 --use
docker buildx inspect --bootstrapThe builder must support all platforms specified in your build command.
Multi-platform pushes require valid registry authentication:
# Login to Docker Hub
docker login
# Login to other registries
docker login ghcr.io
docker login your-private-registry.com
# Verify authentication works
docker buildx build --platform linux/amd64,linux/arm64 \
--push -t ghcr.io/username/myimage:latest .Without proper authentication, the push will fail even if the build succeeds. Ensure your credentials have push permissions for the target repository.
For CI/CD pipelines, use the official Docker GitHub Actions:
name: Build Multi-Platform Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
push: true
tags: username/myimage:latestThe setup-qemu-action and setup-buildx-action handle all the necessary configuration automatically.
### Understanding Buildx Drivers
Buildx supports multiple drivers with different capabilities:
| Driver | Multi-Platform | Push | Load | Use Case |
|--------|---------------|------|------|----------|
| docker | No | Yes | Yes | Single-arch local builds |
| docker-container | Yes | Yes | No* | Multi-platform builds |
| kubernetes | Yes | Yes | No | Building in K8s clusters |
| remote | Yes | Yes | No | Remote BuildKit instances |
*docker-container can load to local daemon with containerd image store enabled.
### Creating Platform-Specific Builds
Sometimes you need different Dockerfile instructions per platform:
FROM --platform=$BUILDPLATFORM golang:1.21 AS builder
# BUILDPLATFORM = builder's native platform
# TARGETPLATFORM = target platform for the image
ARG TARGETOS TARGETARCH
# Cross-compile for target platform
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /app
FROM alpine:latest
COPY --from=builder /app /app
CMD ["/app"]Using --platform=$BUILDPLATFORM runs the build stage on your native architecture (faster), while TARGETOS and TARGETARCH are set to the target platform.
### Debugging Platform Issues
# Check what platforms a registry image supports
docker buildx imagetools inspect nginx:latest
# Verify local builder platforms
docker buildx inspect --bootstrap 2>&1 | grep -i platform
# Test platform emulation
docker run --rm --platform linux/arm64 arm64v8/alpine uname -m
# Should output: aarch64
docker run --rm --platform linux/amd64 amd64/alpine uname -m
# Should output: x86_64### Performance Optimization
Cross-platform builds via emulation are slow. Consider these optimizations:
1. Use native builders when possible: Set up remote builders on actual ARM/x86 hardware
2. Cache dependencies: Use --cache-from and --cache-to with registry caching
3. Cross-compile instead of emulate: For Go, Rust, etc., cross-compile on native arch
4. Build in parallel: Buildx builds platforms concurrently by default
# Use registry cache for faster rebuilds
docker buildx build --platform linux/amd64,linux/arm64 \
--cache-from type=registry,ref=myregistry/myimage:cache \
--cache-to type=registry,ref=myregistry/myimage:cache,mode=max \
--push -t myregistry/myimage:latest .### Troubleshooting Common Scenarios
Error: "docker exporter does not currently support exporting manifest lists"
- Cause: Using --load with multi-platform
- Fix: Use --push or enable containerd image store
Error: "multiple platforms feature is currently not supported for docker driver"
- Cause: Default driver doesn't support multi-platform
- Fix: docker buildx create --driver docker-container --use
Error: "failed to solve: process ... did not complete successfully"
- Cause: Build failing on one platform (often QEMU-related)
- Fix: Check QEMU installation, reduce concurrent platforms
Slow builds on non-native platforms
- Cause: QEMU emulation overhead
- Fix: Use cross-compilation or native remote builders
image operating system "linux" cannot be used on this platform
How to fix 'image operating system linux cannot be used on this platform' in Docker
manifest unknown: manifest unknown
How to fix 'manifest unknown' in Docker
cannot open '/etc/passwd': Permission denied
How to fix 'cannot open: Permission denied' in Docker
Error response from daemon: failed to create the ipvlan port
How to fix 'failed to create the ipvlan port' in Docker
toomanyrequests: Rate exceeded for anonymous users
How to fix 'Rate exceeded for anonymous users' in Docker Hub