NestJS应用无法连接Docker容器内非root用户的MySQL
NestJS无法连接Docker内MySQL非root用户的问题排查
1. 用户权限未开放远程访问
你通过docker exec连接时用的是cleaner@localhost身份,但NestJS是从宿主机(192.168.0.1)发起连接,此时用户权限可能仅限制了本地访问。
检查init.sh里的用户创建语句,必须确保授权范围包含远程IP:
- 允许任意IP访问:用
cleaner@% - 仅允许宿主机IP:用
cleaner@192.168.0.1
正确的SQL示例:
CREATE USER 'cleaner'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON 目标数据库名.* TO 'cleaner'@'%'; FLUSH PRIVILEGES;
注意:如果之前已经启动过MySQL容器,需要删除容器和数据卷才能让修改后的初始化脚本生效,执行docker-compose down -v && docker-compose up -d
2. Docker网络或连接地址配置错误
- 如果NestJS运行在宿主机:确认Docker Compose中MySQL的端口映射已正确配置(
"3306:3306"),NestJS配置里的host用localhost或192.168.0.1 - 如果NestJS也运行在Docker容器:必须和MySQL容器在同一个Docker网络中,此时NestJS配置的host应该用Docker Compose中MySQL的服务名(比如
mysql),而不是宿主机IP
3. NestJS配置参数错误
核对app.module.ts中的数据库配置:
- 用户名、密码是否和
init.sh里的完全一致(注意大小写、特殊字符) - 数据库名称是否正确,确保
cleaner用户拥有该数据库的操作权限
TypeORM配置示例:
@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', // 容器内运行则用服务名'mysql' port: 3306, username: 'cleaner', password: '你的密码', database: '目标数据库名', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, }), ], }) export class AppModule {}
4. MySQL 8.0+认证插件兼容性问题
MySQL 8.0默认使用caching_sha2_password认证插件,部分客户端可能不支持,导致连接失败。可以在init.sh中修改用户的认证插件:
ALTER USER 'cleaner'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

