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

Docker部署项目时Express.js后端连接MySQL报错getaddrinfo ENOTFOUND

问题解决方案

核心错误原因

配置的核心问题是容器内部服务互访时错误使用了宿主机映射端口,同时缺少数据库初始化必备的环境配置,具体修复步骤如下:


1. 修改数据库连接配置端口

修改DataBaseHandler配置文件里的端口参数:

this.connection = mysql.createConnection({
    host: 'database',
    user: 'root',
    password: 'testingpassword',
    database: 'KuoteSuite',
    port: 3306 // 从3318改为3306
});

说明:Docker Compose 会为所有服务创建默认内部网络,服务之间通过服务名互访时,直接使用容器内部暴露的端口即可。你配置的3318是映射到宿主机的端口,仅用于宿主机工具访问数据库,容器内部MySQL默认监听的是3306端口。


2. 补全docker-compose中数据库服务的环境变量

在docker-compose.yml的database服务下添加环境变量,保证容器启动时自动初始化数据库、配置root密码:

database: 
  build: ./database
  container_name: database-container
  command: --default-authentication-plugin=mysql_native_password
  restart: always
  ports: 
    - 3318:3306
  # 新增以下环境变量配置
  environment:
    MYSQL_ROOT_PASSWORD: testingpassword
    MYSQL_DATABASE: KuoteSuite

如果你的./database目录下的Dockerfile没有自动建库、导入初始表的逻辑,启动后需要手动进入数据库容器创建需要的表结构。


3. 修复服务启动顺序问题

depends_on仅保证容器的启动先后顺序,不会等待MySQL完全初始化完成、可以接受连接后再启动后端服务,大概率会出现首次启动时后端先启动、连接数据库失败的情况,可以任选一种方式修复:

  • 给后端服务添加启动等待逻辑:使用wait-for-it脚本,等待database的3306端口通了之后再启动node服务
  • 后端代码加数据库重连逻辑:连接失败后间隔2-3秒重试,最多重试5-10次
  • 临时修复的话,启动后手动重启backend容器即可:docker restart backend-container

可选优化:适配异步查询逻辑

你当前使用的mysql库默认是回调式API,直接用await不会生效,建议换成mysql2/promise,适配async/await语法:

  1. 安装依赖:npm install mysql2
  2. 修改连接创建逻辑即可正常使用await语法调用查询接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:07