Nest.js TypeORM连接到本地数据库(在docker容器上)



我有本地MySQL数据库创建在docker容器从以下docker- composition .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
container_name: mysqldb
image: mysql

并且它工作得很好-我可以进入docker容器,以root用户(或dbuser)登录并创建数据库,表,执行查询等。我也有Nest.js应用程序,使用@nestjs/typeorm模块连接到数据库使用以下ormconfig.json:

{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "dbuser",
"password": "changeme",
"database": "test",
"synchronize": true,
"entiries": ["src/**/*/entity.ts"]
}

这里是问题-当我启动应用程序时,我得到以下错误:

Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'dbuser'@'172.22.0.1' (using password: YES)

似乎所有的数据在ormconfig。Json是正确的-为什么我的应用程序不能连接到数据库?

您没有将端口绑定到本地主机。

快速解决方案:将以下内容添加到docker-compose.yml中的mysql服务中:

ports:
- "3306:3306"

更完整的解决方案移动你的NestJS应用到你的docker-compose.yml

  1. 在你的文件夹中创建dev.Dockerfile,设置如下:
FROM node:16-alpine
WORKDIR /srv/app
CMD npm run start:dev
  1. 添加你的应用到docker-compose.yml:
api:
build:
context: .
dockerfile: ./dev.Dockerfile
volumes:
- ./:/srv/app
depends_on:
- mysql
environment:
MYSQL_HOST: "mysql"
ports:
- "3000:3000"

如果你这样做,你的应用程序将通过Docker Compose网络访问MySQL实例,而不需要将MySQL端口绑定到本地主机。它仍然会给出很好的DX,因为在这个设置中你将有热重新加载。

我希望它有帮助。如有问题,请随时评论,我将解释/编辑。

最新更新