Docker Compose部署MySQL遇「服务器请求未知认证方法」错误求助
解决Docker部署MySQL + Adminer时出现"The server requested authentication method unknown to the client"错误
这个问题我部署的时候也碰到过,根源很明确:MySQL 8.0及以上版本默认启用了caching_sha2_password这种更安全的认证插件,但部分版本的Adminer(或者其他旧数据库客户端)还不支持这个认证方式,所以连接时就会抛出这个错误。下面给你几个实用的解决办法:
方法一:修改MySQL默认认证插件(最便捷)
直接在你的stack.yml里给MySQL服务添加环境变量,强制它使用旧的mysql_native_password认证方式,这样Adminer就能正常连接了。修改后的配置如下:
# Use root/example as user/password credentials version: '3.1' services: db: image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: 'pass' MYSQL_DATABASE: 'db' MYSQL_USER: 'user' MYSQL_PASSWORD: 'pass' # 新增这一行,指定默认认证插件为mysql_native_password MYSQL_DEFAULT_AUTH: mysql_native_password adminer: image: adminer restart: always ports: - 8888:8080
修改完配置后,需要清理旧的容器和数据卷(因为之前的数据卷已经保存了旧的用户认证信息),然后重新启动:
# 停止并移除当前容器 docker-compose -f stack.yml down # 删除关联的MySQL数据卷(注意:这会清空所有数据库数据,有重要数据请先备份) docker volume rm $(docker volume ls -q -f name=$(basename $(pwd))_*) # 重新启动容器 docker-compose -f stack.yml up -d
方法二:手动修改已有用户的认证方式(适合已有数据的场景)
如果你的数据库里已经有数据,不想删除数据卷,可以先启动容器(虽然连接报错,但容器本身是运行的),然后进入容器修改用户的认证插件:
- 先查看MySQL容器的名称或ID:
docker ps
- 进入MySQL容器的命令行:
docker exec -it <你的MySQL容器名/ID> mysql -uroot -ppass
- 执行SQL修改用户的认证方式:
-- 修改普通用户的认证插件 ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; -- 修改root用户的认证插件(如果需要用root连接的话) ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; -- 刷新权限使修改生效 FLUSH PRIVILEGES;
执行完这些命令后,重启Adminer容器就能正常连接了。
方法三:升级Adminer到兼容版本
部分新版本的Adminer已经支持caching_sha2_password认证,你可以尝试指定adminer:latest或者更高版本的镜像,不过这种方式有时候会因为镜像缓存或者版本兼容问题不生效,所以还是前两种方法更可靠。
内容的提问来源于stack exchange,提问作者Navin Gelot
相关产品推荐
相关产品推荐

