Docker Compose部署Rails应用无法连接PostgreSQL数据库求助
Rails容器连接PostgreSQL失败排查与解决
问题核心
Rails应用容器尝试连接127.0.0.1:5432失败,说明实际使用的数据库主机配置仍指向本地回环地址,而非Docker Compose的db服务名。以下是具体排查和修复步骤:
1. 修正.env文件的数据库主机配置
当前.env文件中POSTGRES_HOST=127.0.0.1不符合Docker Compose服务间通信规则,需改为服务名postgres:
POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_HOST=postgres POSTGRES_DB=postgres
2. 确认Rails database.yml配置
检查config/database.yml,确保数据库主机引用POSTGRES_HOST环境变量,而非硬编码地址:
default: &default adapter: postgresql encoding: unicode host: <%= ENV.fetch("POSTGRES_HOST") %> username: <%= ENV.fetch("POSTGRES_USER") %> password: <%= ENV.fetch("POSTGRES_PASSWORD") %> database: <%= ENV.fetch("POSTGRES_DB") %> development: <<: *default
3. 强制覆盖API服务的环境变量
若需确保POSTGRES_HOST生效,可在api服务的environment字段显式声明,覆盖.env中的值:
services: api: <<: *app build: . # ... 其他配置 ... environment: POSTGRES_HOST: postgres
4. 解决PostgreSQL未就绪问题
depends_on仅保证容器启动,不保证数据库服务就绪。给db服务添加健康检查,让API等待数据库完全启动:
services: db: <<: *app image: postgres:16.2 volumes: - ./tmp/db:/var/lib/postgresql/data environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - 5432:5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 api: # ... 其他配置 ... depends_on: db: condition: service_healthy
5. 验证容器内环境变量
进入API容器,检查实际生效的变量值:
docker-compose exec api sh echo $POSTGRES_HOST # 应输出postgres echo $DATABASE_URL # 应包含@postgres:5432
6. 清理缓存并重新构建
旧缓存可能保留错误配置,执行以下命令重置:
docker-compose down -v docker-compose build --no-cache docker-compose up
内容的提问来源于stack exchange,提问作者Genry Wood
相关产品推荐
相关产品推荐

