Docker(Apple Silicon/M1预览版)MySQL:“在清单列表条目中没有匹配的linux/arm64/v8清单”。

445
我正在运行最新版本的Docker Apple Silicon Preview。我创建了教程中的容器/映像并且工作正常。当我尝试创建自定义YAML文件并运行docker-compose时,拉取mysql时出现以下错误: ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries。 这是我的YAML文件摘录:
version: '3'

services:
  # Database
  db:
    image: mysql-server:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: wp
      MYSQL_USER: wp
      MYSQL_PASSWORD: wp
    networks:
      - wpsite 

我尝试了 :latest 和 :8 两个版本,结果出现了相同的错误。它可以正常拉取 phpmyadmin 和 wordpress。


3
MySQL 的维护者是否已经为该架构推送了镜像? - jonrsharpe
1
只有amd64映像... mysql标签- Docker Hub - Akihito KIRISAKI
1
@Sam mysql-server:5.7 版本太旧,不支持 arm64!https://hub.docker.com/layers/mysql/mysql-server/5.7/images/sha256-96f7f199868eaaf9dd9c3cff47021831f5525047b41b0c6a8bf1187936a3e9d2?context=explore - Akihito KIRISAKI
如果有linux/amd64镜像可用,我相信这是潜在的问题:https://github.com/containerd/containerd/issues/3225 - Aidan Feldman
显示剩余2条评论
24个回答

11

可以尝试启动/运行容器(适用于 Mac M1)

docker run -d -p 3306:3306 --name mysql --platform linux/x86_64 --env MYSQL_ROOT_PASSWORD=12345 mysql

9

如果您在mysql的Dockerfile中有以下代码:

FROM mysql:8.0.28

请将其更改为

FROM --platform=linux/x86_64 mysql:8.0.28

因为Apple M1上的Docker将查找ARM映像,而MySQL不发布ARM映像,这就是为什么您会收到以下错误提示:

failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest

使用--platform标志,尽管我们正在使用ARM处理器,但我们告诉docker我们要使用x86_64映像。


8
请参考以下链接了解已知问题。在您的Mac终端中运行:

请参考以下链接了解已知问题。在您的Mac终端中运行:

softwareupdate --install-rosetta

然后在docker-compose文件中,需要有类似以下的内容:

mysql_gdpr:
    platform: linux/x86_64
    image: mysql/mysql-server:8.0.23
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: "user_security"
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_USER: "security"
      MYSQL_PASSWORD: "pleasechangeit"

2
只需添加 platform: linux/x86_64 即可解决问题。 - Shreyansh Panchal
1
Rosetta是一个不错的选择,谢谢!https://docs.docker.com/docker-for-mac/apple-silicon/ - DevJ3rry

4
为了解决这个问题,我们需要将带有值的平台传递到您的Docker镜像/文件中。
使用docker-compose.yaml文件:
services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    ...

使用 Docker 文件:

FROM --platform=linux/x86_64 mysql:5.7

使用 docker pull 命令:

docker pull --platform=linux/x86_64 mysql:5.7

使用DOCKER_DEFAULT_PLATFORM参数:

export DOCKER_DEFAULT_PLATFORM=linux/x86_64

其他一些知名的平台包括:linux/amd64linux/arm64等。


一个非 Docker 专家的愚蠢问题。在哪里运行 export DOCKER_DEFAULT_PLATFORM=linux/amd64? - Sayf
1
嗨 @Sayf,在运行脚本之前,你需要从Shell脚本或命令提示符中进行导出。 - Ranga Reddy

3
使用下面的图片解决了我的问题。
mysql/mysql-server:8.0.23

2
请注意,在arm64/v8上使用--platform linux/x86_64可能会失去Linux Native AIO支持,涉及IT技术相关内容。请查看Docker容器日志:
[ERROR] [MY-012585] [InnoDB] Linux Native AIO interface is not supported on this platform. Please check your OS documentation and install appropriate binary of InnoDB.
[Warning] [MY-012654] [InnoDB] Linux Native AIO disabled.

考虑使用 mysql/mysql-server 代替,因为它具有原生的arm64/v8支持。

2
  • 在我的 M1-Pro 芯片上,使用此命令可以工作。

docker run --platform linux/amd64 --name mysql-5-7 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7


2

我在M1 Pro上也遇到了这个问题,对我来说最稳定的解决方法是在Docker引擎设置中禁用buildkit,即将默认值true设置为false。此外,这里还有一个未解决的问题:https://github.com/docker/for-mac/issues/5873


2
看这个 GitHub post
由于“Oracle 只提供预编译的 Arm64 二进制文件”,您可以使用以下命令获得该文件:
Image --> mysql:8.0-oracle docker run -d --name mysql-8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<your_password> mysql:8.0-oracle

2

更改docker命令中的平台

参数: --platform linux/x86_64


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