如何设置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` %>