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

Docker环境下Sequelize连接PostgreSQL失败问题求助

问题分析与解决方法

核心问题1:数据库服务名称与连接地址不匹配

你的docker-compose.yml中数据库服务名为userDB,但.env文件里DB_HOST设为db——Docker Compose中,服务名就是容器的主机名,应用容器无法解析db这个不存在的主机,导致DNS解析错误EAI_AGAIN。

修复方案二选一:

  • 方案A:修改.env文件的DB_HOST为userDB:
PORT=3000
DB_HOST=userDB
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=userDb
  • 方案B:修改docker-compose.yml中的数据库服务名为db:
version: '3'
services:
  db: # 此处改为db
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: userDb
    ports:
      - 5432:5432
    volumes:
      - db-data:/var/lib/postgresql/data
  # 其余配置保持不变

核心问题2:应用启动过早,数据库未就绪

PostgreSQL容器启动后需要几秒完成初始化,你的应用会在容器启动后立刻尝试连接,此时数据库还未准备好,也会导致连接失败。

修复方案:

方法1:代码中添加连接重试逻辑

修改start.ts的连接逻辑,增加重试机制:

// sequelize 从 database 文件导入
const connectWithRetry = async () => {
  try {
    await sequelize.authenticate();
    logger.info('Connected to the database.');
    app.listen(port, () => {
      logger.info(`Server is running on port ${port}.`);
    });
  } catch (err) {
    logger.error('Database connection failed, retrying in 3 seconds...', err);
    setTimeout(connectWithRetry, 3000);
  }
};

connectWithRetry();

方法2:Docker Compose中添加健康检查与依赖

修改docker-compose.yml,给数据库服务添加健康检查,让应用等待数据库就绪后再启动:

version: '3'
services:
  userDB:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: userDb
    ports:
      - 5432:5432
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d userDb"]
      interval: 3s
      timeout: 5s
      retries: 5
  app:
    build: .
    ports:
      - 3000:3000
    environment:
      DB_HOST: ${DB_HOST}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    depends_on:
      userDB:
        condition: service_healthy # 等待数据库健康检查通过

额外检查项

  • 确保.env文件和docker-compose.yml在同一目录下,或者运行docker-compose up时通过--env-file指定.env路径
  • 确认应用Dockerfile中已正确复制.env文件到容器内(如果容器内需要读取.env的话)

内容的提问来源于stack exchange,提问作者Bhanu Prakash War

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:10:28