非Docker化Ruby on Rails连接Docker内PostgreSQL数据库报错如何解决
连接失败的核心原因
- Rails数据库配置未指定
host参数:PostgreSQL客户端默认优先使用Unix域套接字建立连接,但Docker部署的PostgreSQL仅监听容器内部的TCP端口,不会对外暴露Unix套接字文件,因此触发找不到套接字的报错。 - 开发/测试环境未配置数据库密码:你在docker-compose中为PostgreSQL设置了默认密码
pgdev2021,但Rails配置中对应环境没有填写密码,即使走TCP连接也会被鉴权拒绝。 - 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:将数据持久化到本地指定目录(不需要声明命名卷)
方案2:使用Docker命名卷存储数据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/dataversion: "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 postgrespgdev2021可正常进入数据库后,再执行rails db:prepare即可完成操作。
内容的提问来源于stack exchange,提问作者tkhobbes
相关产品推荐
相关产品推荐

