如何设置 database.yml 以连接到 Postgres Docker 容器?

How to setup database.yml to connect to Postgres Docker container?

我有一个 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] %>

但这感觉很丑陋而且很老套。有没有更好的方法?

你可以先设置正确的环境变量,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://}

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

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