【Docker/Docker Compose】no matching manifest for linux/arm64/v8への対処法

こんにちは。
Dockerを学び始め、Docker ComposeでRails/MySQLのアプリケーションを構築した際にエラーに遭遇したので、対処法をこちらにアウトプットしていきます。

尚、「それは違うよ」など指摘箇所がございましたら
ご教授いただけますと幸いです。

## :boy_tone2:対象読者

-  `ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries` に悩まされているApple siliconをお使いの方。

## :computer:環境

まずは私の開発環境について記載します。
- MacBook Air(M1, 2020) Monterey 12.2.1
- Docker Client 20.10.12
- Docker Server 20.10.12
- docker-compose version 1.29.2

## :pushpin:結論

お忙しい方向けに先に結論を述べておきます。
いくつか方法はあるみたいです。

① `platform: linux/x86_64` を `docker-compose.yml` に追加。

```yml:docker-compose.yml
  db:
    # 以下を追加
    platform: linux/x86_64
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
```

参考：　[M1 Macでno matching manifest for linux/arm64/v8が発生した](https://ryotarch.com/docker/no-matching-manifest-for-linux-arm64-v8-on-m1-mac/)

② `FROM mysql/mysql-server:latest` を `Dockerfile` に追加。
 
```dockerfile:Dockerfile
FROM mysql/mysql-server:latest
```

参考：[DOCKER COMMUNITY FORUMS](https://forums.docker.com/t/docker-mysql-in-macbook-air-m1-i-need-help/119737/3)

上記の違いとしては `docker-compose.yml` に記載しているCPUアーキテクチャが異なります。②の方は、 `platform: linux/amd64` であり、①の方は `platform: linux/x86_64` を指定しております。
ご自身のCPUアーキテクチャと同じ方法をやってみるといいかと思います。

＊CPUアーキテクチャによって方法が異なるのか偶然の事象だけなのか、お恥ずかしながら筆者の勉強不足のためわかりかねますので、あくまでも一つの参考として受け取ってください。詳しい方がいらっしゃいましたら、ご教授いただけますと幸いです。

## :outbox_tray:どんなエラー？

では、どんなエラーが発生したのかを見ていきます。
以下のコマンドでコンテナを開始した際に、 `ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries` が表示され、正常にコンテナを開始することができませんでした。

```terminal:ターミナル
$ docker-compose run web rails new . --force --database=mysql
Creating network "rails_docker_default" with the default driver
Pulling db (mysql:8.0)...
8.0: Pulling from library/mysql
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
```

以前にもRailsで開発をしていた際に、似たようなワードのエラーと遭遇したことがありました。
なので、調査としては比較的スムーズでした。

ちなみに余談ですが、Dockerさんは [Rosetta 2](https://ja.wikipedia.org/wiki/Rosetta#Rosetta_2) のインストールを推奨しているようです。
Rosseta 2を適用しているかはFinderからでも確認できるので [こちら](https://blog.looseknot.jp/mac/m1mac_terminal_rosetta.html) で確認してみるといいかもしれません。

> Docker Desktop for Apple silicon
> ....
> to get the best experience, we recommend that you install Rosetta 2
> [Docker公式](https://docs.docker.com/desktop/mac/apple-silicon/)

話を戻します。
[こちらの記事](https://ryotarch.com/docker/no-matching-manifest-for-linux-arm64-v8-on-m1-mac/) で私の状況と全く同じ方がいらっしゃったので、参考にさせていただきました。
`docker-compose.yml` に `platform: linux/x86_64`　とプラットフォームを指定してあげます。

```yml:docker-compose.yml
  db:
    # 以下を追加
    platform: linux/x86_64
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
```

では、再度コマンドを打つと...

```terminal:ターミナル
$ docker-compose run web rails new . --force --database=mysql
Pulling db (mysql:8.0)...
8.0: Pulling from library/mysql
15115158dd02: Pull complete
d733f6778b18: Pull complete
1cc7a6c74a04: Pull complete
c4364028a805: Pull complete
.
.
.
Done in 15.61s.
Webpacker successfully installed 🎉 🍰
```

しっかりと正常にコンテナを開始して、webpackerのインストールまでいきlocalhostの初期画面もしっかり表示されたので成功しました。

最後までお読みいただきありがとうございます。
この記事でエラー解消の一助となれば嬉しいです。

## :closed_book:参考

- [Docker公式](https://docs.docker.com/desktop/mac/apple-silicon/)
- [M1 Macでno matching manifest for linux/arm64/v8が発生した](https://ryotarch.com/docker/no-matching-manifest-for-linux-arm64-v8-on-m1-mac/)
- [DOCKER COMMUNITY FORUMS](https://forums.docker.com/t/docker-mysql-in-macbook-air-m1-i-need-help/119737/3)