MySQL
docker
MySQL8.0

Docker で MySQL 8.0.4 を使う

docker 上の Rails に mysql:8.0.4 を使おうとして mysql 認証にはまったのでその対応記録

結論

caching_sha2_password の認証形式に対応できないので
下記のカスタム設定をマウントして認証形式を変更する

[mysqld]
default_authentication_plugin= mysql_native_password

mysql8.0

Mysql8.0 ではデフォルトの認証形式を mysql_native_password から caching_sha2_password に変更している。
https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

起きたこと

rake db:create で下記エラー

Mysql2::Error (Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory):

caching_sha2_password に対応させる方法までは調べられなかったので mysql_native_password に設定を変更する方向に。

対応

設定ファイル

下記設定ファイルをローカルに作成

mysql-confd/default_authentication.cnf
[mysqld]
default_authentication_plugin= mysql_native_password

マウント

Docker の Mysql は /etc/mysql/conf.d/*.cnf を読み込むようなのでマウントを設定

docker-comnpose.yml
  mysql:
    image: "mysql:8.0.4"
    # ...
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d

再起動

コンテナ、ボリュームを一旦削除して再起動

MySQL > SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

これで問題なく認証が通るようになった