Docker环境下MySQL客户端认证协议不兼容,数据无法写入数据库求助
解决Docker环境中MySQL认证模式错误及数据写入失败问题
核心问题分析
你遇到的ER_NOT_SUPPORTED_AUTH_MODE错误,本质是MySQL 8.0默认使用caching_sha2_password认证插件,但你的Node.js MySQL客户端版本不支持该插件。同时服务端无法写入数据库,还有环境变量配置遗漏的问题。
具体修复步骤
1. 补充缺失的数据库用户环境变量
你的server.js中使用了process.env.MYSQL_USER,但docker-compose.yml的通用变量里未定义该值,导致数据库连接的用户名是undefined。修改x-common-variables块:
x-common-variables: &common-variables MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: shimshon MYSQL_USER: root # 添加该行,使用root用户连接,也可创建专门的业务用户 MYSQL_HOST_IP: localhost REACT_APP_SERVER_PORT: 3001
2. 确认MySQL服务的认证插件配置生效
你已在mysql服务的command中指定--default-authentication-plugin=mysql_native_password,可通过以下步骤验证:
- 进入mysql容器执行命令:
docker exec -it <mysql容器名> mysql -uroot -proot
- 查看用户认证插件:
SELECT user, plugin FROM mysql.user WHERE user='root';
若plugin显示为mysql_native_password则配置生效,否则重启mysql容器:
docker-compose restart mysql
3. 完善数据库连接代码的错误处理
在server.js中添加连接错误处理,方便排查问题:
const db = mysql.createConnection({ host: process.env.MYSQL_HOST_IP, user: process.env.MYSQL_USER, password: process.env.MYSQL_ROOT_PASSWORD, database: process.env.MYSQL_DATABASE, port : 3306 }); db.connect((err) => { if (err) { console.error('数据库连接失败:', err); return; } console.log('数据库连接成功'); });
4. 验证数据库初始化脚本
确保./db/sample.sql中的表结构无语法错误且已正确创建。可通过phpMyAdmin访问http://localhost:8080,用root/root登录,检查shimshon数据库内的表是否存在。
5. 优化服务启动依赖逻辑
虽然server服务配置了depends_on: [mysql],但Docker仅保证mysql容器启动,不保证数据库服务完全就绪。可以在server的启动命令前添加等待脚本,或在代码中使用连接池替代单连接(如mysql.createPool),利用自动重连机制规避启动时序问题。
内容的提问来源于stack exchange,提问作者Tal Roz
相关产品推荐
相关产品推荐

