M1 DockerでRails×MySQLの環境構築した際に出たエラー runtime: failed to create new OS thread (have 2 already; errno=22)

Docker Docker

結論

  • MySQLのバージョンを5.7系から8.0に変更する
  • MySQL8.0の認証方法をcaching_sha2_passwordからmysql_native_passwordに変更

環境

  • Docker
  • Ruby 2.6.6
  • Rails 6.0.3.6
  • MySQL 5.7.22

経路

既に動いていたプロジェクトに参画することになり、環境構築をすることになった私。
開発環境がDockerでだったため、環境構築手順書もあり、すんなりいくだろうと思っていたが、すぐさまエラーが出てしまう。(あるある)
プロジェクトに参画している人の中で、私だけM1だったので、そのせいでエラーが出ていた。
コンテナは作れたが起動ができない。
よくあるdocker-compose.ymlのdbのところにplatform: linux/amd64を追加する方法でも解決しませんでした。
最近は、M1の人も結構増えてきていると思うので、備忘も兼ねて書くことにしました。

エラー内容

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

原因

M1がMySQLの5.7系に対応していないことが原因でした。
5.7に対応していないことを記述していた記事があったのですが、探せなかったので見つかり次第追記します。

対策

・MySQLのバージョンを8.0に変更する
docker-compose.yml

  db:
    platform: linux/amd64
    restart:
      always
    image: mysql:5.7.22
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - db-data:/var/lib/mysql

を下記のように変更

  db:
    platform: linux/amd64
    restart:
      always
    image: mysql:8.0 # ここを5.7.22から8.0に変更
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - db-data:/var/lib/mysql

この状態で、docker-compose up行い、コンテナを起動します。
しかし、私は、この段階では肝心なapp(アプリ本体)のコンテナが起動できていない状態でした。
それは、appコンテナの最初の起動時にdatabaseを作成するという処理があったため、データベースにアクセスできないというエラーが出ていました。

MySQLのバージョンを8.0にした後、認証方法を変更するのを忘れていました。
MySQL8.0ではユーザーの認証方法がmysql_native_passwordからcaching_sha2_passwordになっていて、いつも通りにパスワードを直打ちしては、弾かれてしまいます。
rootユーザーの認証方法をcaching_sha2_passwordからmysql_native_passwordに変更します。

・データベースのコンテナに入る

docker-compose exec db bash

・MySQLの対話モードに入る

mysql -u root -p

・現在のrootユーザーの認証方法を確認

mysql> select host, user, plugin from mysql.user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
+-----------+------------------+-----------------------+

・rootユーザーの認証方法を変更

ALTER USER root@"%" IDENTIFIED WITH mysql_native_password BY "password";

・再度rootユーザーの認証方法が変更されていることを確認

mysql> select host, user, plugin from mysql.user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
+-----------+------------------+-----------------------+

完了!!!!!!!!!!!!!!!!!!!!!
これで私の場合は、コンテナ起動できました。
これでも解決できなかった方はすみません。

コメント

タイトルとURLをコピーしました