How to fix ERROR: failed to solve: failed to push: unsupported platform in Docker

DockerINTERMEDIATEMEDIUMUpdated Dec 6, 2025ยท 229 views

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.

Quick fix

Fixes ERROR: failed to solve: failed to push: unsupported platform

# 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 ls
  1. Create a new Buildx builder with docker-container driver
  2. Install QEMU for cross-platform emulation
  3. Use --push instead of --load for multi-platform builds
  4. Enable containerd image store (Docker Desktop)
docker โ€” error
# 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 ls
ERROR: failed to solve: failed to push: unsupported platform

What this error means

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.

Typical symptoms

  • Build fails with 'ERROR: failed to solve: failed to push: unsupported platform'
  • Multi-platform builds fail even though single-platform builds work
  • Error appears when using --platform flag with multiple architectures
  • CI/CD pipeline fails during multi-arch image push
  • Build completes but push step fails with platform error
  • Error message: 'multiple platforms feature is currently not supported for docker driver'
  • Warning: 'No output specified for docker-container driver'

Common causes

  1. Using the default Docker driver which doesn't support multi-platform builds (most common)
  2. QEMU emulation not installed for building non-native architectures
  3. Buildx builder not properly initialized or bootstrapped
  4. Trying to use --load instead of --push with multi-platform builds
  5. Docker Desktop containerd feature causing compatibility issues
  6. Registry doesn't support manifest lists or multi-architecture images
  7. Missing or invalid authentication to container registry
  8. Builder created without specifying multi-platform support

How to fix "ERROR: failed to solve: failed to push: unsupported platform"

1Create a new Buildx builder with docker-container driver

The default Docker driver doesn't support multi-platform builds. Create a new builder that uses the docker-container driver:

bash
# 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 ls

The docker-container driver runs builds inside a container, enabling features like multi-platform builds. The --bootstrap flag ensures the builder is ready before use.

2Install QEMU for cross-platform emulation

Building images for architectures different from your host requires QEMU emulation:

bash
# 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.

3Use --push instead of --load for multi-platform builds

Multi-platform images cannot be loaded into the local Docker daemon; they must be pushed to a registry:

bash
# 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.

4Enable containerd image store (Docker Desktop)

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:

bash
# 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.

5Verify builder supports target platforms

Ensure your builder instance supports the platforms you're targeting:

bash
# 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 --bootstrap

The builder must support all platforms specified in your build command.

6Authenticate to container registry

Multi-platform pushes require valid registry authentication:

bash
# 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.

7Set up GitHub Actions for multi-platform builds

For CI/CD pipelines, use the official Docker GitHub Actions:

yaml
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:latest

The setup-qemu-action and setup-buildx-action handle all the necessary configuration automatically.

Advanced notes

### 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:

dockerfile
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

bash
# 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

bash
# 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

Frequently asked questions

What does "ERROR: failed to solve: failed to push: unsupported platform" mean?
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.
How do I fix "ERROR: failed to solve: failed to push: unsupported platform"?
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.
What causes "ERROR: failed to solve: failed to push: unsupported platform"?
Using the default Docker driver which doesn't support multi-platform builds (most common) QEMU emulation not installed for building non-native architectures Buildx builder not properly initialized or bootstrapped
Is the "ERROR: failed to solve: failed to push: unsupported platform" error serious?
It is a medium-severity error โ€” more of a blocker than a risk. The steps above resolve it.

Official resources & further reading