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

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


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

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

```terminal
$ 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.
```

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

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

やはり、caching_sha2_passwordになっています。今回はこれが悪さしているようですので、変更していきます。
![スクリーンショット 2021-03-29 5.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/1c5dc6f9-ceb1-10de-ad9c-1bc8fe0d08ae.png)

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

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

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

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

```sql
mysql> SELECT user, host, plugin FROM mysql.user;
```
無事、mysql_native_passwordに変更されています。
![スクリーンショット 2021-03-29 5.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/d4e93dfb-ccba-835f-34a0-42abdf6ddc00.png)


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

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


# 参考
https://yamasey712.hatenablog.com/entry/2019/08/28/213507

https://qiita.com/majorboy/items/9fbfc78fc7bbc1f35e77

https://qiita.com/shungo_m/items/5363c16b698ef6310014