Nest.js使用TypeORM连接Docker部署的本地MySQL时访问被拒绝如何解决
问题原因
- MySQL容器未暴露端口到宿主机:你当前使用的docker-compose.yml未配置端口映射规则,宿主机3306端口和容器内部3306端口未打通,宿主机上运行的应用无法通过
localhost:3306访问容器内的MySQL服务。 - 数据库用户访问权限受限:默认创建的
dbuser用户仅允许从容器内部(localhost/127.0.0.1)登录,报错信息中的172.22.0.1是Docker网桥的网关IP,属于外部访问地址,未被授予登录权限。 - Nest.js应用部署场景适配问题:如果你的Nest.js应用也运行在Docker容器中,
ormconfig.json中配置的host: "localhost"指向的是Nest应用自身的容器网络,而非MySQL容器,会导致地址访问错误。 - 额外拼写问题:你当前
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
相关产品推荐
相关产品推荐

