Docker: 找到了镜像,但与指定平台不匹配(试图在 Apple M1 上构建 amd64)。

12
免责声明:我对Docker不熟悉,并且意识到自己的无知。
我试图在M1 Pro电脑上构建一个amd64架构的Docker容器。我在docker-compose.yml中指定了 platform: linux/amd64,同时在Dockerfile中使用了 FROM --platform=linux/amd64(同时或单独地)。
如果我将其包含在该容器的Dockerfile中,它可以正常构建,但是shell中的uname -a命令显示的是aarch64架构(而不是x86_64)。
如果我将它包含在docker-compose.yml中,我会得到以下错误:
Error response from daemon: image with reference api:latest was found but does not match the specified platform: wanted linux/amd64, actual: linux/arm64/v8

这里的api是我试图使用docker-compose来构建的容器之一。

文件结构:

.
├── api
│   ├── Dockerfile-API
│   ├── entrypoint.sh
│   └── ...
├── db
│   └── ...
├── docker-compose.yml
└── nginx
    └── ...

./docker-compose.yml:

version: '3.0'
services:
  db:
    ...
  api:
    platform: linux/amd64 # line in question
    build:
      context: ./api
      dockerfile: Dockerfile-API
    command: ./run.sh
    depends_on:
      - db
    env_file: local.env
    networks:
      - nginx_network
    expose:
      - "8000"
    ports:
      - "3000:3000"
    image: api:latest
    ...
  nginx:
    ...

networks:
  nginx_network:
    external: true

volumes:
  ...

./api/Dockerfile-API

FROM --platform=linux/amd64 python3.6 # line in question
...

从目录 . 中,使用在 docker-compose.yml 中设置的平台:

$ docker-compose down
$ docker-compose up
Error response from daemon: image with reference api:latest was found but does not match the specified platform: wanted linux/amd64, actual: linux/arm64/v8

从目录 . 开始,在 ./api/Dockerfile-API 中设置平台:

$ docker-compose down
$ docker-compose up -d
$ docker-compose exec api bash
> uname -a
Linux bc17e565c265 5.10.104-linuxkit #1 SMP PREEMPT Thu Mar 17 17:05:54 UTC 2022 aarch64 GNU/Linux

我非常感激任何有关为什么会发生这种情况以及如何解决它的想法/建议。我的计算机安装了Rosetta 2,并且Docker已经更新到最新版本。谢谢!


请提供一个 [mcve]。 - BMitch
1个回答

8
原文:

事实证明,docker-compose down并不等同于删除镜像。通过 Docker Desktop GUI 删除api镜像后再重建(docker-compose up),我能够创建一个具有x86_64架构的容器。


3
你也可以执行 up --build 命令来强制重新构建镜像,参见 https://docs.docker.com/engine/reference/commandline/compose_up/#options — 注意,如果不使用 docker-compose 而是直接使用 docker build,则需要在选项中添加 --no-cache 来强制从 AMD64 镜像开始构建。 - slhck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接