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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:56