使用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端口就绪后再启动服务:
- 将
wait-for-it.sh脚本下载到项目根目录 - 修改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
相关产品推荐
相关产品推荐

