Node.js本地可连MySQL容器,容器化运行时连接超时如何解决?
问题根因与解决方案
1. 代码硬编码错误(最直接触发原因)
应用源码中数据库连接配置存在语法错误,host字段的process.env.MYSQL_HOST_IP被双引号包裹,实际是把这段文本当成了数据库主机地址,没有读取环境变量的值。
修正后的代码片段:
var con = mysql.createConnection({ host: process.env.MYSQL_HOST_IP, user: "user", password: "password", port: process.env.MYSQL_PORT });
2. 服务未加入同一Docker网络
Docker Compose配置中仅app服务声明了加入app-tier网络,mysql_node服务未配置该网络声明,两个服务不在同一网络下无法互通。在mysql_node的配置中添加网络声明即可:
services: mysql_node: image: mysql:5.7 restart: always networks: - app-tier # 新增该行配置 environment: MYSQL_DATABASE: 'sample_db' MYSQL_USER: 'user' MYSQL_PASSWORD: 'password' MYSQL_ROOT_PASSWORD: 'password' ports: - '3306:3306' expose: - '3306' volumes: - mysql_db:/var/lib/mysql
3. 服务启动时序问题
depends_on仅控制容器的启动顺序,不会等待MySQL进程完全初始化完成再启动应用。MySQL首次启动需要执行库表初始化逻辑,耗时较长,应用启动时MySQL还未就绪就会触发连接超时。可以通过两种方式解决:
- 在
app服务配置中添加restart: on-failure,启动失败自动重试,等待MySQL就绪后即可连接成功 - 给应用添加启动前置检测,等待MySQL端口可访问后再启动Node进程
验证步骤
修改完成后执行以下命令重启服务即可:
docker-compose down -v # 清除旧的挂载卷,避免残留配置影响 docker-compose up --build
内容的提问来源于stack exchange,提问作者Eric Gumba
相关产品推荐
相关产品推荐

