Docker部署Node+MySQL应用时出现Sequelize连接拒绝错误求助
你的错误SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306说明Node.js应用在尝试连接容器内的本地地址(127.0.0.1)的MySQL,而非docker-compose中定义的db服务容器。结合你的配置,主要排查以下几点:
1. 环境变量名不匹配
你的docker-compose.yml中,app服务定义的环境变量是DB_HOST、DB_NAME,但Sequelize代码里读取的是MYSQL_HOST、MYSQL_DB。本地运行时.env文件能提供正确变量,但Docker容器中如果.env文件未被正确加载,或docker-compose的环境变量未和代码变量名对齐,代码会因读取不到MYSQL_HOST而使用默认值localhost,导致连接失败。
修复方案:
将docker-compose.yml中app服务的环境变量名改为和代码一致的前缀:
app: build: . restart: always environment: NODE_ENV: production MYSQL_HOST: db # 改为MYSQL_HOST MYSQL_USER: root MYSQL_PASSWORD: qwer MYSQL_DB: claudio2022 # 改为MYSQL_DB MYSQL_PORT: 3306 ports: - "4000:4000" depends_on: - db
2. MySQL容器未完全就绪,应用提前发起连接
depends_on: - db仅保证db容器启动,但MySQL服务需要时间完成初始化(比如创建数据库、加载初始化脚本),此时应用尝试连接会被拒绝。
修复方案:
- 添加启动等待脚本:修改Dockerfile,在启动应用前等待MySQL端口开放。比如在Dockerfile中添加:
# 安装nc工具(基础镜像无此工具时需执行) RUN apt-get update && apt-get install -y netcat-traditional # 等待db的3306端口开放后再启动应用 CMD ["sh", "-c", "until nc -z db 3306; do sleep 1; done; node your-entry-file.js"]
替换your-entry-file.js为你的应用入口文件名。
- 代码中添加重连逻辑:在Sequelize初始化代码中添加重试机制,避免一次性连接失败:
import { Sequelize } from 'sequelize'; import dotenv from 'dotenv'; dotenv.config(); export const db = new Sequelize( process.env.MYSQL_DB as string, process.env.MYSQL_USER as string, process.env.MYSQL_PASSWORD as string, { dialect: 'mysql', port: parseInt(process.env.MYSQL_PORT as string), host: process.env.MYSQL_HOST as string } ); // 自动重连逻辑 async function initDB() { try { await db.authenticate(); console.log('数据库连接成功'); // 同步模型(按需启用) await db.sync(); } catch (err) { console.error('连接失败,10秒后重试:', err); setTimeout(initDB, 10000); } } initDB();
3. .env文件未被正确复制到Docker容器
如果你的Dockerfile没有将.env文件复制到容器内,dotenv.config()会无法读取到文件,导致代码使用默认值localhost。
修复方案:
检查Dockerfile中是否包含复制.env的指令,添加:
COPY .env ./
确保该指令位于依赖安装指令(如RUN npm install)之后、启动命令之前(若.env影响依赖安装则放在安装前)。
其他排查点
- 查看MySQL容器日志,确认是否有初始化错误(比如初始化脚本执行失败导致数据库未创建):
docker-compose logs db
- 进入app容器,检查环境变量是否正确设置:
docker-compose exec app printenv | grep MYSQL_
若输出中没有MYSQL_HOST=db,说明环境变量未正确加载,需检查docker-compose或Dockerfile配置。
内容的提问来源于stack exchange,提问作者Breno Santin

