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

我有一个Rails应用程序。 在开发和testing环境中,我想让Rails应用程序连接到dockerized Postgres。 Rails应用程序本身不会在一个容器中 – 只是Postgres。

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

我有一个dockerdefault机器运行。 我创build了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。

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

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

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

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

然后我的database.yml主机可以包含该行

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

但这感觉很丑陋。 有没有更好的办法?

你可以先设置一个正确的环境variables,然后从你的database.yml访问它 :

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

用像bashrc(使用bash子串删除 ):

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

我find了一个更简单的方法:

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