Rails连接Docker Postgres报.s.PGSQL.5432套接字不存在错误
问题原因
报错本质是Rails的Postgres适配器默认连接逻辑和你的部署场景不匹配:
- 当
database.yml中未配置host参数时,Rails不会发起TCP网络连接,而是直接尝试读取本地文件系统上Postgres的Unix Socket文件,默认路径就是/tmp/.s.PGSQL.5432 - 你的Postgres实例运行在Docker容器中,容器内部的Socket文件隔离在容器独立文件系统内,不会出现在宿主机的
/tmp目录下,自然会触发文件不存在的报错 - TablePlus等第三方客户端能正常连接,是因为连接时显式指定了主机地址,走TCP协议连接Docker映射到宿主机的数据库端口,和Rails当前默认的Socket连接逻辑完全不同。
修复步骤
- 确认Docker端口映射规则
执行docker ps查看运行中的Postgres容器,确认端口列存在127.0.0.1:5432->5432/tcp的映射关系。如果没有该映射,需要重建容器,启动时添加端口映射参数-p 127.0.0.1:5432:5432,将容器内的5432端口映射到宿主机本地的5432端口。 - 修改数据库配置
编辑项目下的config/database.yml,在default配置段中添加host和port参数,强制走TCP连接,修改后的default段配置如下:
注意不要把host写成default: &default adapter: postgresql encoding: unicode host: 127.0.0.1 port: 5432 username: postgres password: postgres pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>localhost,部分系统下localhost仍会被解析为Unix Socket连接,直接写127.0.0.1可以强制走TCP协议,避免兼容问题。 - 验证修复
保存配置后重启正在运行的Rails服务,再执行数据库操作(比如rails db:migrate、接口请求访问数据库)即可正常连接。下方的development、test、production配置段因为继承了default的公共配置,不需要额外修改。
内容的提问来源于stack exchange,提问作者pastel-bucket
相关产品推荐
相关产品推荐

