背景
2021年4月より、MySQL の最新メジャーバージョンが 8.0 となりましたが、その際にデフォルトのユーザ認証方式が mysql_native_password
から caching_sha2_password
に変更になりました。
しかし、Rails 6.0 ではまだ caching_sha2_password
しかサポートされていないため、何も考えずに環境構築を行うと、rails db:create
などの DB 操作を行うコマンドを実行したときに、ユーザ認証のエラーでコケてしまいます。
そこで、本記事では docker-compose
で APサーバに Rails 6.0、DBサーバに MySQL 8.0 を使用した環境を構築する際の注意点について解説いたします。
ポイント
Rails 側では、caching_sha2_password
しか使用できないため、MySQL 側のユーザ認証設定を caching_sha2_password
に変更するしかありません。
なので、DB コンテナ立ち上げのタイミングで、デフォルトのユーザ認証方式を変更する方法で対応します。
手順
my.cnf の作成
my.cnf
は MYSQL のオプションファイルというもので、MySQL の起動オプションを設定するものになります。
my.cnf
に設定されたオプションは、MySQL が起動するたびに自動的に読み込まれ、毎回コマンド実行をする必要がなくなります。
今回はデフォルトのユーザ認証方式を mysql_native_password
に変更したいので、以下のように my.cnf
を作成いたします。
[mysqld]
default-authentication-plugin=mysql_native_password
volume コンテナで my.cnf を共有する
前章で作成した my.cnf
ですが、コンテナ起動時にコンテナの指定のディレクトリに配置する必要があります。
オプションファイルをグローバルに適用したい場合、DB サーバの /etc/mysql/conf.d/
に my.cnf
を配置すれば起動時に読み込まれるので、docker-compose.yml
に以下のように記述して、ローカルのファイルをコンテナと共有します。
// docker-compose.yml
services:
db:
image: mysql:8.0
// 省略...
volumes:
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf
ちなみにローカルのディレクトリ構成は以下のようになっているものとします。
├── db
│ ├── my.cnf
├── docker-compose.yml
結果
デフォルトの認証方式が変更されたことで、root
ユーザの認証方式が mysql_native_password
で作成されていれば成功です。
mysql> select User, plugin from mysql.user;
+----------------------------+-----------------------+
| User | plugin |
+----------------------------+-----------------------+
| ... 省略
| root | mysql_native_password |
+----------------------------+-----------------------+
コメント
> Rails 側では、caching_sha2_password しか使用できないため、MySQL 側のユーザ認証設定を caching_sha2_password に変更するしかありません。
→ 「Rails 側では、mysql_native_password しか使用できないため、MySQL 側のユーザ認証設定を mysql_native_password に変更するしかありません。」ではないでしょうか?