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个回答

783

技术上讲,这不会解决你在ARM上运行MySQL的问题,但目前你可以像这样将platform添加到你的服务中:

services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    ...

或者考虑使用MariaDB,它可以像这样作为一种替代选择:

services:
  db:
    image: mariadb:10.5.8
    ...

在我的M1上,Docker Preview的两种方法对我都有效


我也对“percona”镜像(类似于加强版的MySQL)做了同样的事情。谢谢! - Shyam
4
我看到文档已经更新,包括在模拟器下运行的指令(平台为linux/amd64标志),以及鼓励使用mariadb支持。 - Sam
24
对于没有使用docker-compose的情况,您可以执行以下命令: docker run --platform linux/x86_64 mysql 这将在M1上拉取并运行正确的镜像。非常感谢您发布的这篇文章! - JasonD
1
我可以建议您将MySQL版本更改为8吗? 编辑太短,无法提交。 - jibeeeee
3
@AlexShtromberg - 这应该也适用于英特尔机器,因为它是x86架构… - Stefan W
显示剩余14条评论

290

对于M1 Mac来说,同样的问题只需要运行这个命令

docker pull --platform linux/x86_64 mysql

18
我曾在 Mac mini M1 上工作,尽管我不得不添加 v8:linux/x86_64/v8 - Marko
3
适用于我的 MacBook Pro(13英寸,M1,2020年版)。 - Pravanjan
谢谢...在 Mac M1 Pro 上工作了。 - Kudos
为什么这个答案没有被接受,@Sam? - mavili
13
在我的M2上也起作用:export DOCKER_DEFAULT_PLATFORM=linux/x86_64/v8 - btraas
7
M2 PRO: export DOCKER_DEFAULT_PLATFORM=linux/amd64 - keizah7

163
这个答案中,我将以下内容添加到我的本地docker-compose.override.yml中。
services:

  mysql:
    platform: linux/amd64

2
这对我来说真的很有用。M1 Pro 14寸。 - Yala Yala Herzlin
M1 Pro,尝试了上面的答案,没有成功,但这个对我有效。 - Dylan Glockler
我还将mysql版本从5.7.22更改为5.7。 - Morgenstern
1
对我来说不起作用。 - Aquarelle
参与了简单的Apple Silicon M1项目。 - Pathros

61

Oracle 提供了针对 arm64 的 MySQL 8.0.23 docker 镜像。
https://hub.docker.com/r/mysql/mysql-server

若要在 docker-compose 文件中使用,请参考如下:

version: "3.8"
services:
  mysql:
    container_name: mycontainername
    image: mysql/mysql-server:8.0.23
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydatabasename
      MYSQL_ROOT_HOST: "%"
    command: --lower_case_table_names=1

1
非常顺利,Mac Mimi M1,谢谢! - csaborio
我也根据 https://dev59.com/mlUL5IYBdhLWcg3wr5t6#52789430 使用了 command: --default-authentication-plugin=mysql_native_password - tmm1
对我有用。Mac Air M1 2020 Big Sur。 我尝试了所选答案,但被警告模拟linux/x86_64可能会产生错误或内存开销。 非常感谢您。 - Écio Silva
这对我完全没有用。我得到了与OP相同的错误(“清单列表条目中没有匹配的linux / arm64 / v8清单”)。我还尝试将平台设置为“linux / amd64”,“linux / x86_64”和“linux / x86_64 / v8”,仍然收到相同的错误。看起来即使在2022年9月,使用和不使用仿真,在Docker下运行MySQL仍然是不可能的。我无法相信没有人编译M1的MySQL。 - Aquarelle
@Aquarelle,显然你的设置有问题,因为我和无数其他人都可以在Apple M1处理器上完美地运行MySQL(带或不带仿真)。如果你花点时间阅读我上面提到的镜像的Dockerfile,你会看到Oracle明确表示它是为ARM编译的。https://hub.docker.com/r/mysql/mysql-server - bpossolo
显示剩余3条评论

41

Docker在其官方文档中说:

并非所有图像都可用于ARM64架构。您可以添加--platform linux/amd64来在仿真下运行Intel图像。特别是,mysql图像不适用于ARM64。您可以通过使用mariadb图像来解决此问题。

(来源在这里)

因此,您需要将platform:linux/amd64添加到您的docker-compose.yml中使您的项目正常工作。

它看起来像:

services:
    mysql:
        image: mysql:5.7
        platform: linux/amd64
        ...

正如你可能想象的那样,性能不会相同。


37

我遇到了类似的问题,通过在我的dockerfile中加入以下这行代码解决了:

before

FROM ubuntu:18.04

之后

FROM --platform=linux/x86_64 ubuntu:18.04

这非常好,你只需要将以下内容添加到你的 laradock 的 mysql docker 文件中:FROM --platform=linux/x86_64 mysql:${MYSQL_VERSION} - Louwki

23

在指定镜像后,您只需要指定平台即可。适用于M2处理器。

version: '3'

services:
  # Database
  db:
    image: mysql-server:5.7
    platform: linux/amd64 <--------- this line to add
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: wp
      MYSQL_USER: wp
      MYSQL_PASSWORD: wp
    networks:
      - wpsite 

1
谢谢,这在M1芯片上也能运行。这很有趣,所以它是通过Rosetta来实现的吗? - undefined

20

在我的 Mac M1 上,通过在服务中指定平台键可以使这个方法运行。

services:
  mysql:
    platform: linux/amd64
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - 3306:3306

14

对于那些与特定版本相处困难的人,以下方法对我无效:

docker run --platform linux/x86_64 mysql:5.7.26 -e MYSQL_ROOT_PASSWORD=pass

但这确实做到了:

 docker run --platform linux/x86_64 mysql:5.7 -e MYSQL_ROOT_PASSWORD=pass

13

只有Mac(M1芯片)的开发人员

在我的团队中,我是唯一一个使用Mac(M1芯片)的人。其他人都使用Windows,所以如果我想要与其他人在git上兼容,我需要使用一种解决方案,将与我的机器相关的配置部分隔离出来。

解决方案

为了添加更多配置但使用不同的文件,可以在与正常的docker-compose文件docker-compose.yml相同的目录中创建一个新的docker-compose文件docker-compose.mac.yml。(可以使用任何名称代替mac)

代码

version: '2'
services:
  mysql:
    image: mysql:8.0.26
    platform: linux/amd64

然后用这个命令启动它:
docker-compose -f docker-compose.yml -f docker-compose.mac.yml up

工作原理

它将从docker-compose.yml文件中复制所有内容,并粘贴到docker-compose.mac.yml文件中,但不进行替换。

在我看来,这对于拥有不同计算机的大型团队非常有用。


谢谢!如果您将文件命名为docker-compose.override.yml,docker-compose将自动识别它。这样,您就可以使用标准的docker-compose命令,而无需使用-f标志。 - undefined

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