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
相关产品推荐
相关产品推荐

