【问题标题】:How to setup database.yml to connect to Postgres Docker container?如何设置 database.yml 以连接到 Postgres Docker 容器?
【发布时间】:2016-01-08 18:31:14
【问题描述】:

我有一个 Rails 应用程序。在开发和测试环境中,我希望 Rails 应用程序连接到 dockerized Postgres。 Rails 应用程序本身不会在容器中 - 只是 Postgres。

我的 database.yml 应该是什么样的?

我有一台 docker default 机器正在运行。我创建了 docker-compose.yml:

postgres:
  image: postgres
  ports:
    - "5432:5432"
  environment:
    - POSTGRES_USER=timbuktu
    - POSTGRES_PASSWORD=mysecretpassword

我运行 docker-compose up 来运行 Postgres。

然后我运行docker-machine ip default来获取Docker虚拟机的IP地址,并相应地更新了database.yml:

...
development: 
  adapter: postgresql
  host: 192.168.99.100
  port: 5432
  database: timbuktu_development
  username: timbuktu
  password: mysecretpassword
  encoding: unicode
  pool: 5
...

所以一切都很好,我可以在其容器中连接到 Postgres。

但是,如果其他人提取 repo,他们将无法使用我的 database.yml 连接到 Postgres,因为他们的 Docker 默认机器的 IP 地址与我的不同。

那么我该如何更改我的 database.yml 来解决这个问题?

我的一个想法是让他们通过运行docker-machine env default 获取他们的 Docker 默认机器的 IP 地址,并将 env DOCKER_HOST 行粘贴到他们的 bash_rc 中。例如,

export DOCKER_HOST="tcp://192.168.99.100:2376"

那么我的database.yml主机可以包含这行

host: <%= ENV['DOCKER_HOST'].match(/tcp:\/\/(.+):\d{3,}/)[1] %>

但这感觉丑陋和骇人听闻。有没有更好的办法?

【问题讨论】:

  • 你的问题对我的 docker 设置很有帮助 :)

标签: ruby-on-rails postgresql docker docker-compose


【解决方案1】:

你可以先设置一个正确的环境变量,然后access it from your database.yml:

host: <%= ENV['POSTGRES_IP'] %>

使用 bashrc 之类的(使用 bash substring removal):

export DOCKER_HOST=$(docker-machine env default)
export POSTGRES_IP=${DOCKER_HOST#tcp://}

【讨论】:

    【解决方案2】:

    我找到了一个更简单的方法:

    host: <%= `docker-machine ip default` %>
    

    【讨论】:

    • 这也应该可以,我只是更喜欢将配置值(环境变量)与 如何 获取/设置该值分开。不过,+1。
    • host: &lt;%= ENV['POSTGRES_IP'] || `docker-machine ip default`%&gt;
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-08-02
    • 2021-02-22
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多