Docker mysql:5.7 root用户无法登录的问题

/ Docker / 0 条评论 / 1040浏览

docker-compose.yml

services:
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./data/mysql/data:/var/lib/mysql
      - ./mysql/mysql.conf.d:/etc/mysql/mysql.conf.d
    ports:
      - 3306:3306

启动容器 docker-compose up -d

进入容器

docker exec -it compose_mysql_1 bash

容器内运行,使用环境变量配置的用户root和密码123456无法登录

mysql -uroot

并提示:

Access denied for user 'root'@'localhost' (using password: NO)

./mysql/mysql.conf.d下创建配置文件mysqld.cnf 配置文件添加跳过root跳过权限验证登录选项

[mysqld]
skip-grant-tables

修改完成之后,需要将mysqld.cnf的权限设置为644,如果是windows,需要设置为只读 修改完之后重启mysql

docker restart compose_mysql_1

再次进入容器

docker exec -it compose_mysql_1 bash

容器内运行,发现可以直接登录数据库

mysql -uroot

注意:此时随便输入一个用户和密码都可以登录数据库,这样是非常不安全的!!! 然后我们查看root用户的信息

use mysql;
select user,authentication_string,host from user;
root	                     *DA0EC9C0D632DA0FEA07B221371349B2A8440DA9	localhost
mysql.session	     *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE	localhost
mysql.sys	     *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE	localhost
root	                    *DA0EC9C0D632DA0FEA07B221371349B2A8440DA9	%

此时发现root用户其实是有密码的,只不过不是docker-compose.yml设置的123456,至于为什么我现在也没弄明白 如果此时直接修改密码的话,会出现以下报错

# 会报错
alter user 'root'@'localhost' IDENTIFIED BY '123456';
alter user 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

所以使用update语句来修改

update mysql.user set authentication_string=password('123456') where user='root';

修改完成之后,去掉mysqld.cnf配置文件里面的skip-grant-tables,重启容器

docker restart compose_mysql_1

此时已经可以连接