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

Docker化Rails应用连接PostgreSQL报错:Unix套接字无法找到

解决Docker部署Rails应用PostgreSQL连接问题

问题核心

这个错误是因为Rails容器试图通过本地Unix套接字连接PostgreSQL,但Docker环境中,Rails和PostgreSQL是两个独立容器,必须用TCP/IP连接而非本地套接字。

具体修复步骤

1. 修正database.yml配置

确保配置里用容器服务名作为数据库主机,而非本地套接字。示例配置:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db  # 需和docker-compose.yml中postgres服务名一致
  username: <%= ENV.fetch("POSTGRES_USER") { "postgres" } %>
  password: <%= ENV.fetch("POSTGRES_PASSWORD") { "postgres" } %>
  port: 5432

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV.fetch("MYAPP_DATABASE_PASSWORD") %>

2. 检查Docker Compose配置

确认postgres服务名称为db(和上面的host对应),同时配置环境变量与端口。示例:

version: '3.8'
services:
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - RAILS_ENV=development
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

volumes:
  postgres_data:

注意:depends_on仅保证db容器先启动,不保证PostgreSQL服务完全就绪。若需等待数据库启动,可添加wait-for-it脚本或延迟Rails启动命令。

3. 重建并重启容器

执行以下命令清理旧资源并重新启动:

docker-compose down -v  # 彻底删除容器、网络及数据卷(需重置数据库时使用)
docker-compose build
docker-compose up

4. 验证数据库连接

进入Rails容器手动测试:

docker-compose exec web rails db:create  # 创建数据库
docker-compose exec web rails db:migrate  # 执行迁移

若命令执行成功,说明连接配置正确。

相关学习要点

Docker + Rails 基础

  • 容器网络通信:同一Docker Compose项目下的容器,可通过服务名互相访问
  • 环境变量优先:用环境变量替代硬编码配置,便于多环境切换
  • PostgreSQL容器初始化:首次启动时会根据环境变量自动创建指定用户和数据库

排查技巧

  • 网络连通性测试:在Rails容器内执行ping db或telnet db 5432,验证端口是否开放
  • 查看PostgreSQL日志:docker-compose logs db,检查服务启动是否有报错
  • 数据库状态检查:进入PostgreSQL容器执行psql -U postgres,查看数据库列表

内容的提问来源于stack exchange,提问作者Kamidesu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:50:49