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

