You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:53:32