尝试从 Ruby on Rails 连接到 postgres(在 docker 容器中)

Posted

技术标签:

【中文标题】尝试从 Ruby on Rails 连接到 postgres(在 docker 容器中)【英文标题】:trying to connect to postgres (in a docker container) from Ruby on Rails 【发布时间】:2021-12-29 07:52:17 【问题描述】:

我正在玩 Docker,想在 docker 容器中设置 postgreSQL,然后从(非 dockerized)Ruby on Rails 应用程序连接到它。这是 docker compose 文件 - 我正在关注 this approach here。

version: "3"
services:
  db:
    image: "postgres:13"
    container_name: "postgres_dev"
    environment:
      POSTGRES_PASSWORD: "pgdev2021"
    ports:
      - "54320:5432"
    volumes:
      - pgdata://Users/thomas/Documents/Production/PostgreSQL/dbstorage

volumes:
  pgdata:

但是当我尝试 e. G。运行“Rails db:prepare”,我得到这个错误:

rails aborted!
ActiveRecord::ConnectionNotEstablished: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.54320"?
/Users/thomas/Documents/Websites/rails-frontend/bin/rails:5:in `<top (required)>'
/Users/thomas/Documents/Websites/rails-frontend/bin/spring:10:in `block in <top (required)>'
/Users/thomas/Documents/Websites/rails-frontend/bin/spring:7:in `<top (required)>'

Caused by:
PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.54320"?
/Users/thomas/Documents/Websites/rails-frontend/bin/rails:5:in `<top (required)>'
/Users/thomas/Documents/Websites/rails-frontend/bin/spring:10:in `block in <top (required)>'
/Users/thomas/Documents/Websites/rails-frontend/bin/spring:7:in `<top (required)>'
Tasks: TOP => db:prepare
(See full trace by running task with --trace)

当我检查时,容器正在运行

编辑:database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS")  5  %>
  port: 54320
  user: postgres

development:
  <<: *default
  database: db_development
test:
  <<: *default
  database: db_test
production:
  <<: *default
  database: db_production
  username: postgres
  password: <%= ENV['MY_DB_PASSWORD'] %>

【问题讨论】:

没有帮助,同样的错误。我尝试了下面的行,docker exec .... bash,然后是 psql,但这也不起作用。我可以 bash 进入 docker,但 psql 给出以下错误:“psql:错误:连接到“localhost”(127.0.0.1)的服务器,端口 54320 失败:连接被拒绝。服务器是否在该主机上运行并接受 TCP/IP连接?” 在容器内你必须连接localhost:5432 而不是54320 我正在尝试从主机连接到容器......我想我需要以某种方式找到容器的 IP,然后将其作为“主机”添加到我的 database.yml 中? 【参考方案1】:

如果我想启动 Postgres,我总是提供用户、密码和初始数据库。

您是尝试进行容器间网络还是从主机系统访问?如果是内部容器网络,请记住默认情况下服务的主机名等于服务名称。

示例撰写文件:

version: "3.9"
services:
  postgres:
    image: "postgres:13"
    container_name: "postgres_dev"
  ports:
    - 5432:5432
  environment:
    POSTGRES_USER: root
    POSTGRES_PASSWORD: password
    POSTGRES_DB: my-database

您现在可以从您的docker-compose.yml 中指定的任何其他service 连接postgres:5432。或从您的主机连接http://localhost:5432。更多关于docker compose networking。

通过访问容器并运行一些东西来验证:

docker exec -it postgres_dev bash
psql -h localhost -p 5432 -U root -P password -d my-database

【讨论】:

以上是关于尝试从 Ruby on Rails 连接到 postgres(在 docker 容器中)的主要内容,如果未能解决你的问题,请参考以下文章

在 EC2 Ruby on Rails 上连接到 datastax 集群上的 cassandra 节点

将 Ruby on Rails 连接到现有的 MySQL 数据库(以前安装的 XAMPP)

我无法上传到 Heroku RUBY ON RAILS

Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)

Ruby on Rails:无法加载rack / handler /

Ruby on Rails 在现有资源上返回 404