【问题标题】:How to connect to a PostgreSQL container with Rails如何使用 Rails 连接到 PostgreSQL 容器
【发布时间】:2023-04-06 04:37:01
【问题描述】:

我有一个 Docker 文件,它使用 nginx 和 PostgreSQL 数据库声明我的 Ruby on Rails 应用程序。

我很难理解我的 Rails 应用程序如何连接到我的 PostgreSQL 容器,因为它根本没有连接。

我构建了链接图像的 Docker 文件:

web:
  build: .
  command: bundle exec puma -C config/puma.rb
  volumes:
    - /tmp:/tmp
    # - /log:/data
    - .:/my_project_folder
  links:
    - nginx
    - db

nginx:
  build: ./nginx
  volumes:
    - /tmp:/tmp
  ports:
    - 80:80

db:
  image: postgres
  environment:
      POSTGRES_PASSWORD: "Postgres2019!"
  ports:
    - "15432:5432"
  volumes:
    - /Users/fred/Documents/Postgres/data:/var/lib/postgresql/data

并像这样配置了我的 database.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  host: 0.0.0.0
  port: 15432
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password: Postgres2019!
development:
  <<: *default
  database: mos_development

但是每当我尝试运行我的应用程序时,Rails 都无法连接到返回的数据库

ActiveRecord::ConnectionTimeoutError

但是当我检查我的容器时,一切都运行良好:

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                     NAMES
1cfbc010829a        project_web           "bundle exec puma -C…"   19 minutes ago      Up 13 minutes                                 project_web_1
1774e2b89452        postgres              "docker-entrypoint.s…"   20 minutes ago      Up 13 minutes       0.0.0.0:15432->5432/tcp   project_db_1
0ce7dbb6d735        project_nginx         "nginx -g 'daemon of…"   3 hours ago         Up 13 minutes       0.0.0.0:80->80/tcp        project_nginx_1

如果我的 PostgreSQL 容器在 0.0.0.0:15432 运行,那么我的 Rails 容器应该也可以在 0.0.0.0:15432 连接到它,对吧?

【问题讨论】:

  • 您的 rails 容器不应连接到 0.0.0.0:15432,它应该连接到 db:5432 或 :15432。如果你有一个静态的 docker 主机 IP,你也可以使用 :15432

标签: ruby-on-rails ruby postgresql docker


【解决方案1】:

试试这个:

default: &default
  adapter: postgresql
  encoding: unicode
  host: db    # <-- change this line
  port: 15432
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password: Postgres2019!
development:
  <<: *default
  database: mos_development

Rails 应用程序链接到dbdb:15432

【讨论】:

    【解决方案2】:

    这通常是 Active Record 配置的问题,而不是数据库本身的问题。

    您可以通过从命令行运行heroku pg:info 并查看连接计数与您的计划的最大计数比较来验证您的数据库是否有可用连接。

    此错误通常是在 Active Record 池大小设置得太低或尝试在大量工作进程之间共享少量数据库连接时引起的。

    你可以玩这个:

    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 1 } %>
    

    就这部分问题而言:

    如果我的 postgres 容器在 0.0.0.0:15432 运行,那么我的 rails 容器也应该在 0.0.0.0:15432 连接到它,对吧?

    是的,你必须使用:

     docker-host-ip:15432 
    

    【讨论】:

    • 没错,我必须将此值更改为 1,并且还必须按照下一个答案的报告将主机设置为“db”
    • @Frederico,将值从 5 更改为 1。
    【解决方案3】:

    如果你有太多的环境变量,你可以在一个 env 文件中设置它们。 例如

    # .env.docker
    RAILS_MAX_THREADS=4
    USERNAME=posgres
    ...
    ...
    

    然后通过env_file在你的docker-compose文件中指定.env.docker文件:

    db:
      image: postgres
      env_file: .env.docker
      environment:
          POSTGRES_PASSWORD: "Postgres2019!"
      ports:
        - "15432:5432"
      volumes:
        - /Users/fred/Documents/Postgres/data:/var/lib/postgresql/data
    ...
    ...
    

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 2019-04-25
      • 2016-07-14
      • 2017-10-15
      • 2023-04-08
      • 2023-01-19
      • 2011-01-11
      相关资源
      最近更新 更多