使用Docker Compose部署Node+MySQL容器,TypeORM连接遇权限拒绝错误
解决TypeORM连接Docker MySQL容器时的权限拒绝错误
错误提示Error: Access denied for user ''@'172.29.0.3' (using password: YES)的核心原因是连接MySQL时未传入用户名,同时还有几处配置遗漏和重复问题,以下是具体修复步骤:
1. 补全TypeORM配置的必填字段
当前TypeORM的DataSource配置缺少连接MySQL必须的username(用户名)和database(数据库名)字段,修改后配置如下:
import {DataSource} from 'typeorm'; import * as dotenv from 'dotenv'; dotenv.config(); export const appDataSource = new DataSource({ type: 'mysql', host: process.env.MYSQL_HOST, port: 3306, username: process.env.MYSQL_USER, // 新增用户名参数 password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_NAME, // 新增数据库名参数 entities:[ 'src/entities/*.js' ], synchronize: true, logging: true });
2. 清理.env文件的重复配置
你的.env文件重复定义了MYSQL_PASSWORD,删除其中一个,保持配置唯一性:
MYSQL_USER = root MYSQL_PASSWORD = password MYSQL_NAME = test MYSQL_HOST = db
3. 完善Docker Compose配置
当前MySQL容器未自动创建test数据库,且app服务缺少MYSQL_USER环境变量,另外depends_on仅保证容器启动顺序,不代表数据库服务就绪,需添加健康检查确保数据库可用后再启动app:
version: '3.8' services: db: image: mysql restart: always ports: - '3306:3306' environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: test # 启动时自动创建test数据库 healthcheck: # 健康检查验证数据库服务状态 test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppassword"] interval: 5s timeout: 5s retries: 5 app: build: . command: npm start volumes: - .:/usr/app/ ports: - '8000:8000' depends_on: db: condition: service_healthy # 等待数据库健康检查通过再启动 environment: MYSQL_HOST: db MYSQL_NAME: test MYSQL_PASSWORD: password MYSQL_USER: root # 新增用户名环境变量
4. 确保应用等待数据库连接成功再启动
在你的Node.js启动脚本中,添加数据库初始化逻辑,确保连接成功后再启动服务:
appDataSource.initialize() .then(() => { console.log("数据库连接成功"); // 这里启动你的HTTP服务或其他业务逻辑 }) .catch((err) => { console.error("数据库连接失败:", err); process.exit(1); // 连接失败时退出进程 });
内容的提问来源于stack exchange,提问作者MohamedSalah97
相关产品推荐
相关产品推荐

