Rails 6.0 + MySQL 8.0 構成のアプリを Docker で構築すると、ユーザ認証が caching_sha2_password なので rails db コマンドが実行できない

Docker

背景

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 |
+----------------------------+-----------------------+

コメント

  1. W より:

    > Rails 側では、caching_sha2_password しか使用できないため、MySQL 側のユーザ認証設定を caching_sha2_password に変更するしかありません。

    → 「Rails 側では、mysql_native_password しか使用できないため、MySQL 側のユーザ認証設定を mysql_native_password に変更するしかありません。」ではないでしょうか?

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