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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:17:49