Docker on Mac M1 gives: "The requested image's platform (linux/amd64) does not match the detected host platform"
Asked Answered
P

8

97

I want to run a docker container for Ganache on my MacBook M1, but get the following error:

The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

After this line nothing else will happen anymore and the whole process is stuck, although the qemu-system-aarch64 is running on 100% CPU according to Activity Monitor until I press CTRL+C.

My docker-files come from this repository. After running into the same issues there I tried to isolate the root cause and came up with the smallest setup that will run into the same error.

This is the output of docker-compose up --build:

Building ganache
Sending build context to Docker daemon  196.6kB
Step 1/17 : FROM trufflesuite/ganache-cli:v6.9.1
 ---> 40b011a5f8e5
Step 2/17 : LABEL Unlock <[email protected]>
 ---> Using cache
 ---> aad8a72dac4e
Step 3/17 : RUN apk add --no-cache git openssh bash
 ---> Using cache
 ---> 4ca6312438bd
Step 4/17 : RUN apk add --no-cache   python   python-dev   py-pip   build-base   && pip install virtualenv
 ---> Using cache
 ---> 0be290f541ed
Step 5/17 : RUN npm install -g [email protected]
 ---> Using cache
 ---> d906d229a768
Step 6/17 : RUN npm install -g yarn
 ---> [Warning] The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
 ---> Running in 991c1d804fdf

docker-compose.yml:

version: '3.2'
services:
  ganache:
    restart: always
    build:
      context: ./development
      dockerfile: ganache.dockerfile
    env_file: ../.env.dev.local
    ports:
      - 8545:8545

  ganache-standup:
    image: ganache-standup
    build:
      context: ./development
      dockerfile: ganache.dockerfile
    env_file: ../.env.dev.local
    entrypoint: ['node', '/standup/prepare-ganache-for-unlock.js']
    depends_on:
      - ganache

ganache.dockerfile:

The ganache.dockerfile can be found here.

Running the whole project on an older iMac with Intel-processor works fine.

Pollinosis answered 4/9, 2021 at 11:37 Comment(4)
can you run hello-world docker image?Actinometer
It really looks like the image you're trying to use isnt available for arm architecture which is the one for the M1 MAC. Try running docker run ubuntu:latest echo hello world instead. this image comes with linux/arm64/v8 architcture comapred to v5 in hello-world:linux (which is the only one that comes with any dort of arm support)Nostril
Hello World works, yes. But so many other docker images not that we are using in the company. I am only person with M1 :(Pollinosis
As of a while ago, Docker on an M1 can run linux/amd64 imagesAlurd
S
31

With docker-compose you also have the platform option.

version: "2.4"
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.1.1
    hostname: zookeeper
    container_name: zookeeper
    platform: linux/amd64
    ports:
      - "2181:2181"
Sladen answered 6/5, 2022 at 22:4 Comment(0)
E
60

If you're planning to run the image in your laptop, you need to build it for the cpu architecture of that particular machine. You can provide the --platform option to docker build (or even to docker-compose) to define the target platform you want to build the image for.

For example:

docker build --platform linux/arm64  .
Erythroblast answered 9/9, 2021 at 14:14 Comment(2)
add "buildx" and run like: $ docker buildx build --platform linux/amd64 .Unexperienced
for those using docker compose, add the platform: linux/amd64 option to the affected images in your docker-compose.ymlSethrida
S
49

On M1 MacBook Pro, I've had success using docker run --platform linux/amd64

Example

docker run --platform linux/amd64 node
Sladen answered 30/12, 2021 at 2:5 Comment(8)
Note that node should be replaced with the appropriate image name. Otherwise it'll be pulling and running node rather than the desired image.Younker
Doesn't work for me. Perhaps you meant arm64 or this solution works for specific images only.Helpful
This worked for me with pydicom/dicom image. Thank you!Phail
Did not work for me. Used following command on M1: docker run --platform linux/amd64 -p 4000:4000 in28min/hello-world-python:0.0.1.RELEASEBronwen
This example is just for the node image and is run to an amd64 image on arm64 hardware. Not all images appear to support this.Sladen
I don't this works anymore this is 2023 already outdated answerNitrification
It still works fine. ❯ docker run --platform linux/amd64 node --version v19.7.0Sladen
for docker-compose, use platform: linux/amd64Mcmahan
S
31

With docker-compose you also have the platform option.

version: "2.4"
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.1.1
    hostname: zookeeper
    container_name: zookeeper
    platform: linux/amd64
    ports:
      - "2181:2181"
Sladen answered 6/5, 2022 at 22:4 Comment(0)
P
8

We were facing this issue with the localstack image.

Below is the snippet from the docker-compose.yml

localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
    image: localstack/localstack:1.2.0
    ports:
      - "4566:4566"
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock

One of the developers working with M1 chipset on Mac was getting this issue.

So there are few approaches

  1. Add platform: linux/amd64 in the image declaration in docker-compose.yml
  2. Run this command export DOCKER_DEFAULT_PLATFORM=linux/amd64 before running the docker-compose.yml
  3. Best is to refer the architecture specific image. For e.g. in our case, we used image: localstack/localstack:1.2.0-amd64

Reference https://hub.docker.com/layers/localstack/localstack/1.2.0-amd64/images/sha256-474600686aa98e8c79df96a9e7e5f689487c3a624ba8e464a0b6c3f45985cbcd?context=explore

Paregmenon answered 28/12, 2022 at 13:27 Comment(0)
B
4

Build the image by passing the list of architecture

Try this:

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t username/demo:latest --push .

Note: ensure to place "." at the end

Bohun answered 27/7, 2022 at 18:29 Comment(2)
This solved my issue, what does the buildx do?Prizewinner
See docker.com/blog/multi-arch-imagesLeatherneck
S
2

You should have the docker buildx installed. If you don't have the docker-desktop you can download the binary buildx from github: https://github.com/docker/buildx/

After installation you can build your image like Theofilos Papapanagiotou said

<downloaded_path>/buildx --platform linux/amd64 ...

Soninlaw answered 12/8, 2022 at 14:38 Comment(0)
S
1

Use colima. then you'll be able to run x86/64 only images on your M1/M2 Mac as well

brew install colima
colima start --memory 4 --arch x86_64
docker run [image name you want to run]

That's it. it's quite simple. https://github.com/abiosoft/colima

Sunwise answered 2/3, 2023 at 4:27 Comment(2)
Looks rather messy. What does it do behind the scene?Nitrification
it's just a lightweight container runtime like Docker Desktop. You can check out if you're interested github.com/abiosoft/colima btw, Docker Desktop team is trying to add new feat which is using Rosetta for old arch images, it doesn't work well yet but we'll be able to run x86/64 images soon i reckonSunwise
I
-1

You might need to run

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

in order to register foreign file formats with the kernel.

Individualism answered 3/1, 2022 at 10:9 Comment(2)
Tried this one at M1 but it doesn't work for me :(Helpful
Maybe this does not apply for M1. I based this on the steps needed for x86, see here stereolabs.com/docs/docker/building-arm-container-on-x86 There, there is the pre-requisite of installing qemu binfmt-support qemu-user-staticIndividualism

© 2022 - 2024 — McMap. All rights reserved.