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

使用Sequelize与Docker连接MySQL数据库时遭遇连接拒绝错误

Docker-Compose下Node.js(Sequelize)连接MySQL遇ConnectionRefusedError

错误信息

ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 192.168.32.2:3306

当前配置文件

docker-compose.yml

version: '3.9'

services:
  db:
    image: 'mysql'
    ports:
      - '3306:3306'
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: sweeft
      MYSQL_USER: sweeft_user
      MYSQL_PASSWORD: 12345678

  server:
    build: .
    ports:
      - '3000:3000'
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_USER: sweeft_user
      DB_PASSWORD: 12345678
      DB_NAME: sweeft

Sequelize连接代码

import Sequelize from 'sequelize';

const sequelize = new Sequelize('sweeft', 'sweeft_user', 12345678, {
  host: 'db',
  dialect: 'mysql',
});

export default sequelize;

问题原因与解决方法

核心原因

depends_on仅保证容器启动顺序,无法确保MySQL服务完全初始化完成。Node服务启动时,MySQL可能还在初始化数据库、创建用户,导致连接被拒绝。

解决方案1:添加MySQL健康检查

在docker-compose.yml的db服务中配置健康检查,确保MySQL服务就绪后再启动Node服务:

db:
  image: 'mysql'
  ports:
    - '3306:3306'
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: 12345678
    MYSQL_DATABASE: sweeft
    MYSQL_USER: sweeft_user
    MYSQL_PASSWORD: 12345678
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p12345678"]
    interval: 5s
    timeout: 5s
    retries: 5

server:
  build: .
  ports:
    - '3000:3000'
  depends_on:
    db:
      condition: service_healthy
  environment:
    DB_HOST: db
    DB_USER: sweeft_user
    DB_PASSWORD: 12345678
    DB_NAME: sweeft

解决方案2:在代码中添加连接重试逻辑

修改Sequelize连接代码,添加自动重试机制,直到连接成功:

import Sequelize from 'sequelize';

const sequelize = new Sequelize('sweeft', 'sweeft_user', 12345678, {
  host: 'db',
  dialect: 'mysql',
});

async function initDBConnection() {
  try {
    await sequelize.authenticate();
    console.log('数据库连接成功');
    // 后续初始化模型等操作
  } catch (error) {
    console.error('连接失败,10秒后重试:', error.message);
    setTimeout(initDBConnection, 10000);
  }
}

initDBConnection();

export default sequelize;

解决方案3:使用等待脚本

在Node服务的Dockerfile中引入等待脚本,等待MySQL端口就绪后再启动服务:

  1. 将wait-for-it.sh脚本下载到项目根目录
  2. 修改Dockerfile:
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .
COPY wait-for-it.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/wait-for-it.sh

CMD ["wait-for-it.sh", "db:3306", "--", "node", "your-entry-file.js"]

额外检查项

  • 确认Sequelize连接参数(数据库名、用户名、密码)与docker-compose环境变量完全一致
  • 进入Node容器执行ping db,验证内部网络是否能解析MySQL服务主机名

内容的提问来源于stack exchange,提问作者Luka Akhalbedashvili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:48:13