修改 Docker-MySQL 容器的 默认用户加密规则
背景介绍
今天开始做集成测试,需要把程序和环境重新部署在新的服务器上。项目的环境都是基于Docker来的,所以数据库也是选择从Docker官网上面拉官方的MySQL镜像。(Tag = 8.0.12)
从部署到导入数据,一切正常。完事之后进入container里面简单的查了下数据的个数,em~~~ 没问题了。 于是边和测试的同事说了一声,下午可以看是集成测试了。
中午吃完发,顶着烈日出去办点事,完事之后正往回走着突然就接到了测试同事的电话。。
QA:那个XX,你的数据库部署好像有问题啊,我这边用工具连不上。。。 好吧,
我: 没问题啊,我上午检查过的。。。 好吧,我一会就回去,咱们一起看看吧。
原因
回到公司,找到同事,发现报错如下: “Authentication plugin 'caching_sha2_password' cannot be loaded”。
问题的原因:是从MySQL8.0 开始,默认的加密规则使用的是 caching_sha2_password。 我看了下我从官方拉下来的 docker 镜像版本是8.0.12(完美中招)
解决方案
于是在网上搜了一下,很快就找到了解决方案。
1. 首先找到当前数据库用户root的加密规则
mysql>use mysql; mysql>select user, host, plugin from user
2. 修改加密规则为“mysql_native_password”
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
注: password 替换为 root 的密码; 或者直接更新这一行 pluggin字段 的值为 “mysql_native_password”
完成后效果如下:
其实到了这儿,问题已经解决。 那么再想一下,既然这个设置是默认的,那么我们能不能在部署数据库的把它修改掉呢?
更为优雅的解决方案
又重新回到了 MySQL 官方在docker的仓库中,仔细的阅读了一遍官方的说明。其实,我们在启动MySQL 容器的时候,是可以修改一些设置的。主要有2种方式。1. 自定义配置文件,并 mount 到 container里。这样在MySQL启动时,会加载我们的配置文件。 2. 启动MySQL容器是传入CMD,通过命令修改默认加密规则(下面绿色部分)
# docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=weather_db -p 3307:3306 --name test-mysql --restart always -v /home/ct/mysql/data:/var/lib/mysql
mysql:8.0.12 --default-authentication-plugin=mysql_native_password
另外,还有通过 docker-compose 方式来实现的,这里就不再赘述,请参考官方描述。
OK!感谢收看,同时也欢迎大家积极留言讨论哈~~
参考
https://majing.io/posts/10000021021192
https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded
https://hub.docker.com/r/_/mysql/