【docker】db:createすると、Plugin caching_sha2_password could not be loaded...のエラーハマった話


背景

railsで作成中のアプリに、開発環境にDockerを導入していました。

DBをcreateしようとするも下記エラー

コンテナのビルドは問題なく出来たので、次にDBを作成するべくこのコマンドを実行したら、下記のエラーに遭遇しました。

$ docker-compose run web bundle exec rake db:create


Creating network "golfscore_default" with the default driver
Creating golfscore_db_1 ... done
Creating golfscore_web_run ... done
Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
Couldn't create 'golfscore_development' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

原因と対策

Mysql 8以降、認証プラグインの仕様が変わったためのようです。
ユーザーのプラグインをmysql_native_passwordに変更していきます。

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

まずはコンテナ内のMysqlにログインするため、コンテナIDを調べます。

$ docker ps                                            
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
bcc91696ca70   mysql:8.0.23   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:4306->3306/tcp   golfscore_db_1

コンテナIDがわかったので、入ります。

$ docker exec -it bcc91696ca70 bash

入れました。Mysqlに入ります。

root@bcc91696ca70:/# mysql -uroot -p

Mysqlのパスワードを入力します。

Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

このコマンドを実行して、現在のプラグインの状況を確認します。

mysql> SELECT user, host, plugin FROM mysql.user; 

やはり、caching_sha2_passwordになっています。今回はこれが悪さしているようですので、変更していきます。

下記、2コマンド実行して、root user部分の2箇所を変更します。
('password'部分は各自DBのパスワードを入力)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.01 sec)

変更できたか確認してみます。

mysql> SELECT user, host, plugin FROM mysql.user;

無事、mysql_native_passwordに変更されています。

再度、DBを作成し、無事に成功しました。

$ docker-compose run web bundle exec rake db:create    
Creating golfscore_web_run ... done
Created database 'golfscore_development'
Created database 'golfscore_test'

参考