💎

【M1 Mac】Docker + Rails + MySQLで環境構築 エラー奮闘記

2022/09/01に公開約4,400字

はじめに

Docker + Rails + MySQLで作成中のアプリに参画することになりました。
この3つの組み合わせで開発するのが初めてで、環境構築する際にM1 Macと噛み合わず、さまざまなエラーに苦しめられたので、気をつけてほしいことをまとめました。

前提

  • ローカルにMySQLがインストールされていること

ターミナルでMySQLのバージョンを調べて、インストールされているか確認してください。
筆者は入っておらず、mysql command not foundみたいなエラーが出ました。
最新バージョンをインストールしました。

$ mysql --version
mysql  Ver 8.0.30 for macos12.4 on arm64 (Homebrew)

結論

この手順を踏んだら構築できました。
docker-compose.yml内のどこかに、MySQLのパスワードを記述してあると思いますが、そこが空だと動きませんので、必ずパスワードを入れてください。

docker-compose.yml
db:
+   platform: linux/x86_64
-   image: mysql:5.7
+   image: mysql:8.0
$ docker-compose build
$ docker-compose up -d APIのサービス名
// 立ち上がるまで少し時間を置く
$ docker ps
【コンテナID】 mysql:8.0 〜〜 〜〜
$ docker exec -it コンテナID bash
bash# mysql -uroot -p
// MySQLのパスワードを入力
Enter password:
mysql> SELECT user, host, plugin FROM mysql.user;
    +------------------+-----------+-----------------------+
    | user             | host      | plugin                |
    +------------------+-----------+-----------------------+
    | root             | %         | caching_shad_password|
    | mysql.infoschema | localhost | caching_shad_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    | root             | localhost | caching_shad_password |
    +------------------+-----------+-----------------------+
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; (パスワードはDBのパスワードを入れる)
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; (パスワードはDBのパスワードを入れる)
Query OK, 0 rows affected (0.01 sec)
// 変更できたか確認
mysql> SELECT user, host, plugin FROM mysql.user;
   +------------------+-----------+-----------------------+
   | user             | host      | plugin                |
   +------------------+-----------+-----------------------+
+  | root             | %         | mysql_native_password|
   | mysql.infoschema | localhost | caching_shad_password |
   | mysql.session    | localhost | caching_sha2_password |
   | mysql.sys        | localhost | caching_sha2_password |
+  | root             | localhost | mysql_native_password |
   +------------------+-----------+-----------------------+
mysql> exit
bash# exit
$ docker-compose up -d APIのサービス名
サーバーにアクセスし、APIが立ち上がっているか確認
// フロントやメールサーバーなど諸々起動
$ docker-compose up -d

platformを指定

docker-compose up -dをすると、おそらく下記のエラーが出るかと思います。

Dockerのログ
no matching manifest for linux/arm64/v8 in the manifest list entries

内容としては、「mysqlのdockerイメージにはlinux/arm64/v8用のコンテナがありません」という内容になります。
M1チップのプラットフォームはarm64なのですが、mysqlのイメージのサポートプラットフォームがAMD64なので、不一致となり、このようなエラーが出ます。

  • platformを指定
docker-compose.yml
db:
+   platform: linux/x86_64
    image: mysql:5.7

MySQLのバージョンを5.7系から8.0系に変更する

これだけではまだ動きませんでした。つぎは、このようなエラーが出ました。

Dockerのログ
runtime: failed to create new OS thread (have 2 already; errno=22)

調べたところ、M1がMySQLの5.7系に対応していないのが原因のようです。

  • MySQLのバージョンを8.0系に変更する
docker-compose.yml
db:
    platform: linux/x86_64
+   image: mysql:8.0

docker内のmysqlにログインし、plugin変更

これでも動きませんでした。つぎは、このようなエラーが出ました。

Dockerのログ
Plugin caching_sha2_password could not be loaded: /usr/lib/aarch64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

Couldn't create 'XXXX' database. Please check your configuration.

rails aborted!

Mysql2::Error::ConnectionError: Plugin caching_sha2_password could not be loaded: /usr/lib/aarch64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

Mysql8以降、認証プラグインの仕様が変わったためのようです。
ユーザーのプラグインをmysql_native_passwordに変更していきます。
手順は下記の記事をご参照ください。詳細は割愛します。
【docker】db:createすると、Plugin caching_sha2_password could not be loaded...のエラーハマった話

コンテナ立ち上げ

ここまで来たら、docker-compose up -d APIのサービス名を実行してください。DBの作成が実行され、サーバーにアクセスできればOKです。

参考記事

[Docker] M1 Macで「 no matching manifest for linux/arm64/v8 in the manifest list entries」のエラーの対処法
M1 DockerでRails×MySQLの環境構築した際に出たエラー runtime: failed to create new OS thread (have 2 already; errno=22)

Discussion

ログインするとコメントできます