Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries" エラーの解決方法

2024-04-02

Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries" エラー解説

原因

このエラーは、以下のいずれかの原因によって発生します。

  • 使用しているMySQLイメージがApple M1に対応していない

Docker Hubで公開されているMySQLイメージの中には、まだApple M1に対応していないものがあります。docker pullコマンドでイメージをダウンロードする際に、--platform linux/arm64オプションを指定することで、Apple M1に対応したイメージをダウンロードできます。

  • Dockerの設定がApple M1に対応していない

Dockerの設定ファイルであるdaemon.jsonに、experimentalフラグが設定されていない可能性があります。このフラグを設定することで、DockerはApple M1チップのアーキテクチャに対応したコンテナを実行できるようになります。

解決方法

このエラーを解決するには、以下の方法を試してください。

以下のコマンドを実行して、イメージのアーキテクチャを確認できます。

docker inspect <イメージ名>

出力結果にArchitectureという項目があり、その値がlinux/arm64であれば、Apple M1に対応しています。

Apple M1に対応していないイメージの場合

以下のいずれかの方法で、Apple M1に対応したイメージを取得できます。

  • --platformオプションを指定して、Apple M1に対応したイメージをダウンロードする
docker pull --platform linux/arm64 mysql
  • 公式ドキュメントに記載されている、Apple M1用のイメージを使用する

Dockerの設定ファイルを変更する

以下の手順で、Dockerの設定ファイルdaemon.jsonexperimentalフラグを設定します。

  1. テキストエディタでdaemon.jsonファイルを開きます。

    • ファイルの場所は、以下のコマンドで確認できます。
    docker info | grep -E '^Docker Root Dir|^Config File'
    
{
  "experimental": true
}
  1. ファイルを保存して、Dockerを再起動します。
docker restart

その他

上記の方法で解決しない場合は、以下の情報を調べてみてください。

  • 使用しているMySQLのバージョン
  • 発生したエラーメッセージの詳細

これらの情報をもとに、インターネット上で解決策を検索したり、専門家に相談したりすることができます。




docker-compose.ymlファイル

version: '3'

services:
  mysql:
    image: mysql/mysql:8.0.28-arm64
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - ./data:/var/lib/mysql

  app:
    image: "your-app-image"
    ports:
      - "8080:8080"
    depends_on:
      - mysql

このファイルは、MySQLとあなたのアプリケーションをそれぞれmysqlappというサービスとして定義しています。

  • mysqlサービスは、mysql/mysql:8.0.28-arm64というイメージを使用します。これは、Apple M1に対応したMySQL 8.0.28のイメージです。
  • appサービスは、あなたのアプリケーションのイメージを使用します。
  • volumesセクションで、./dataディレクトリをMySQLのデータボリュームとしてマウントしています。
docker-compose up

このコマンドを実行すると、docker-compose.ymlファイルで定義されたサービスがすべて起動されます。

接続確認

ブラウザでhttp://localhost:3306/phpmyadminを開くと、phpMyAdminにアクセスできます。

ユーザー名: root パスワード: password

注意事項

  • 上記のコードはサンプルです。あなたの環境に合わせて変更する必要があります。
  • your-app-imageの部分には、あなたのアプリケーションのイメージ名を指定してください。

補足

  • 上記のサンプルコードでは、MySQLのデータボリュームをホストマシンのディレクトリにマウントしています。本番環境では、永続ストレージサービスなどを利用して、データボリュームを永続的に保存する必要があります。
  • MySQLのパスワードは、安全な値に変更してください。



その他の解決方法

Rosetta 2は、Apple M1チップ上でIntel x86_64アプリケーションを実行するための互換性レイヤーです。Rosetta 2を使用することで、Apple M1に対応していないMySQLイメージを起動することができます。

Rosetta 2を使用するには、以下の手順が必要です。

  1. ターミナルで以下のコマンドを実行します。
arch -x86_64 docker run <イメージ名>
  1. 以下のコマンドを実行して、Rosetta 2がインストールされていることを確認します。
which rosetta-2

別のMySQLイメージを使用する

MySQL 以外にも、さまざまなデータベースエンジンがあります。PostgreSQLやMariaDBなどのデータベースエンジンを使用することで、Apple M1に対応していないMySQLイメージを使用せずに済む場合があります。

専門家に相談する

上記の方法で解決できない場合は、専門家に相談することを検討してください。

この文書では、Apple M1チップ搭載MacでDockerを使ってMySQLを起動する際に発生するエラー "no matching manifest for linux/arm64/v8 in the manifest list entries" の解決方法について解説しました。


mysql docker apple-silicon


MySQLで重複レコードを処理する:INSERT IGNORE vs INSERT ... ON DUPLICATE KEY UPDATE

MySQLでデータを挿入する際、重複レコードの処理方法として INSERT IGNORE と INSERT . .. ON DUPLICATE KEY UPDATE の2つの方法があります。それぞれ異なる動作をするので、状況に合わせて使い分けることが重要です。...


【MySQL初心者向け】DISTINCTとCOUNTを使いこなして重複なしのレコード数をカウント

MySQLでは、DISTINCTとCOUNTを組み合わせて、重複のないレコードの個数や種類を効率的に取得することができます。このチュートリアルでは、それぞれの機能と、それらを組み合わせたクエリの実行方法について、分かりやすく説明します。DISTINCT...


「INSERT IF NOT EXISTS」と「REPLACE INTO」の違い

MySQLでレコードを挿入する際、すでに同じレコードが存在するかどうかを確認してから挿入したい場合があります。このような場合、INSERT IF NOT EXISTSという機能を使用できます。方法INSERT IF NOT EXISTSを使用するには、以下のいずれかの方法を使用できます。...


【網羅】MySQLのループ処理:FOR EACH、WHILE、カーソル、その他の方法を徹底解説

FOR EACH ループは、テーブルの各行を順番に処理する最も簡単な方法です。構文は以下の通りです。例:WHILE ループは、特定の条件が満たされる間、ループを続ける方法です。構文は以下の通りです。カーソルを使うカーソルは、テーブル内の行を1行ずつ処理するためのより高度な方法です。構文は以下の通りです。...


Dockerコンテナでbashコマンド実行時に発生する「exec: \"bash\": executable file not found in $PATH\": unknown」エラーの原因と解決方法

このエラーは、コンテナ内で bash コマンドを実行しようとした際に、実行ファイルが見つからない場合に発生します。原因としては、以下の2点が考えられます。Dockerイメージに bash がインストールされていないbash コマンドのパスが正しく設定されていない...