Docker Compose中PostgreSQL与Sequelize连接失败求助
解决Docker-Compose中Sequelize无法连接PostgreSQL的问题
问题根源分析
从错误信息和配置来看,核心问题集中在以下几点:
- 数据库连接地址错误:错误日志中的公网IP
217.196.149.50说明服务未连接到Docker内部的PostgreSQL容器,而是指向了外部地址 - Server代码未读取环境变量:当前
server.js中数据库配置变量为空字符串,未从容器环境变量中获取有效配置 depends_on仅保证容器启动顺序,不等待PostgreSQL服务就绪,导致服务启动时数据库还未完成初始化- 环境变量拼写错误:
docker-compose.yml中server服务的POSTGREST_HOST是拼写错误,应为POSTGRES_HOST
具体修复步骤
1. 修正Server代码的环境变量读取
修改server.js中的数据库配置部分,从容器环境变量中获取参数,并添加连接重试逻辑:
//* Postgres const postgresPassword = process.env.POSTGRES_PASSWORD; const postgresUser = process.env.POSTGRES_USER; const postgresDB = process.env.POSTGRES_DB; const postgresPort = process.env.POSTGRES_PORT || 5432; const postgresHost = process.env.POSTGRES_HOST || 'postgres'; // Docker内部用服务名作为主机名 const sq = new Sequelize(`postgres://${postgresUser}:${postgresPassword}@${postgresHost}:${postgresPort}/${postgresDB}`); // 替换原有的连接验证代码,添加重试逻辑 async function connectDB() { try { await sq.authenticate(); console.log('Connection to DB has been established successfully.'); await User.sync(); // 确保表创建在连接成功后执行 } catch (error) { console.error('Database connection failed, retrying in 2 seconds...', error); setTimeout(connectDB, 2000); } } connectDB();
2. 修正Docker-Compose配置
修正环境变量拼写错误,同时为变量添加默认值,避免未配置.env时出错:
version: "3.7" services: postgres: container_name: postgres image: postgres:alpine restart: always environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - ./postgres:/var/lib/postgresql/data networks: - default server: container_name: server depends_on: - postgres environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} POSTGRES_PORT: ${POSTGRES_PORT:-5432} # 默认5432端口 POSTGRES_HOST: ${POSTGRES_HOST:-postgres} # 默认用PostgreSQL服务名作为主机 build: ./server ports: - 3000:3000 volumes: - ./server/app.js:/usr/app/app.js networks: - default networks: default: name: pg-net
3. 配置正确的.env文件
确保.env文件中数据库主机设置为Docker服务名postgres,而非localhost或公网IP:
POSTGRES_USER=your_db_user POSTGRES_PASSWORD=your_db_password POSTGRES_DB=your_db_name POSTGRES_PORT=5432 POSTGRES_HOST=postgres
4. 可选:通过启动脚本等待数据库就绪
如果需要更可靠的初始化顺序,可以修改Server的Dockerfile,添加PostgreSQL客户端并在启动前检查服务状态:
FROM node:alpine WORKDIR /usr/app COPY package*.json ./ RUN npm install COPY . . # 安装PostgreSQL客户端工具 RUN apk add --no-cache postgresql-client # 启动前等待PostgreSQL服务就绪 CMD ["sh", "-c", "until pg_isready -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER}; do sleep 1; done; node app.js"]
内容的提问来源于stack exchange,提问作者M1r2kt1
相关产品推荐
相关产品推荐

