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语法:
- 安装依赖:
npm install mysql2 - 修改连接创建逻辑即可正常使用await语法调用查询接口
内容的提问来源于stack exchange,提问作者IronBoy
相关产品推荐
相关产品推荐

