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

Nest.js使用TypeORM连接Docker部署的本地MySQL时访问被拒绝如何解决

问题原因
  1. MySQL容器未暴露端口到宿主机:你当前使用的docker-compose.yml未配置端口映射规则,宿主机3306端口和容器内部3306端口未打通,宿主机上运行的应用无法通过localhost:3306访问容器内的MySQL服务。
  2. 数据库用户访问权限受限:默认创建的dbuser用户仅允许从容器内部(localhost/127.0.0.1)登录,报错信息中的172.22.0.1是Docker网桥的网关IP,属于外部访问地址,未被授予登录权限。
  3. Nest.js应用部署场景适配问题:如果你的Nest.js应用也运行在Docker容器中,ormconfig.json中配置的host: "localhost"指向的是Nest应用自身的容器网络,而非MySQL容器,会导致地址访问错误。
  4. 额外拼写问题:你当前ormconfig.json中的entiries为拼写错误,正确字段为entities,该问题虽不触发本次报错,但会导致后续实体无法加载、表无法自动创建。
解决方案
  • 第一步:修改docker-compose.yml添加端口映射配置,调整后配置如下:
version: '3.6'
services:
  mysql:
    environment:
      - MYSQL_DATABASE=test
      - MYSQL_ROOT_PASSWORD=changeme
      - MYSQL_USER=dbuser
      - MYSQL_PASSWORD=changeme
    command:
      - --table_definition_cache=100
      - --performance_schema=0
      - --default-authentication-plugin=mysql_native_password
      - --innodb_use_native_aio=0
    volumes:
      - ./init:/docker-entrypoint-initdb.d
    # 新增端口映射配置
    ports:
      - "3306:3306"
    container_name: mysqldb
    image: mysql

修改完成后执行命令重启容器:
docker-compose down && docker-compose up -d
注意:如果之前已经启动过容器且有存量数据,修改环境变量不会生效,可执行docker-compose down -v删除关联数据卷后再重启(操作前请提前备份数据库数据)。

  • 第二步:给dbuser用户授权外部访问权限:
    执行命令进入MySQL容器:
    docker exec -it mysqldb mysql -uroot -pchangeme
    进入MySQL命令行后执行授权语句:
GRANT ALL PRIVILEGES ON test.* TO 'dbuser'@'%' IDENTIFIED BY 'changeme';
FLUSH PRIVILEGES;

如果需要限制访问IP,可将上述语句中的%替换为你报错中的172.22.0.1。

  • 第三步:适配Nest.js部署场景
    如果你的Nest.js应用也运行在Docker容器中,将ormconfig.json中的host值修改为MySQL服务名mysql,同时确保两个容器归属同一个Docker网络。

  • 第四步:修正配置拼写错误
    将ormconfig.json中的entiries字段修改为entities。

内容的提问来源于stack exchange,提问作者Furman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:54:05