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

非Docker化Ruby on Rails连接Docker内PostgreSQL数据库报错如何解决

连接失败的核心原因

  1. Rails数据库配置未指定host参数:PostgreSQL客户端默认优先使用Unix域套接字建立连接,但Docker部署的PostgreSQL仅监听容器内部的TCP端口,不会对外暴露Unix套接字文件,因此触发找不到套接字的报错。
  2. 开发/测试环境未配置数据库密码:你在docker-compose中为PostgreSQL设置了默认密码pgdev2021,但Rails配置中对应环境没有填写密码,即使走TCP连接也会被鉴权拒绝。
  3. docker-compose挂载配置存在错误:你当前的volumes写法不符合规范,PostgreSQL容器的数据默认存储在/var/lib/postgresql/data路径下,你的配置没有正确映射到容器内对应路径,后续可能会出现数据丢失问题。

解决步骤

  • 第一步:修改Rails项目config/database.yml的默认配置段,补全host和password参数,强制走TCP连接:
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  port: 54320
  user: postgres
  host: localhost # 新增,指定走本地TCP连接
  password: pgdev2021 # 新增,和docker-compose设置的密码保持一致
  • 第二步:修正docker-compose.yml的volumes配置,两种可选方案:
    方案1:将数据持久化到本地指定目录(不需要声明命名卷)
    version: "3"
    services:
      db:
        image: "postgres:13"
        container_name: "postgres_dev"
        environment:
          POSTGRES_PASSWORD: "pgdev2021"
        ports:
          - "54320:5432"
        volumes:
          # 本地目录映射到容器内PostgreSQL默认数据存储路径
          - /Users/thomas/Documents/Production/PostgreSQL/dbstorage:/var/lib/postgresql/data
    
    方案2:使用Docker命名卷存储数据
    version: "3"
    services:
      db:
        image: "postgres:13"
        container_name: "postgres_dev"
        environment:
          POSTGRES_PASSWORD: "pgdev2021"
        ports:
          - "54320:5432"
        volumes:
          - pgdata:/var/lib/postgresql/data
    
    volumes:
      pgdata:
    
  • 第三步:重启Docker容器生效配置:
    docker-compose down && docker-compose up -d
    
  • 第四步:验证连接,可先执行本地psql命令确认数据库可访问:
    psql -h localhost -p 54320 -U postgres
    
    输入密码pgdev2021可正常进入数据库后,再执行rails db:prepare即可完成操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:04