假设我的一些 Rails 同事更喜欢在他们自己设置的本地本地开发环境中开发应用程序以满足他们的需求,而我的一些同事更喜欢开发从内部运行的应用程序预装了所有必要工具的 Docker 容器。
现在有 config/database.yml
目前看起来像下面这样以匹配所有本地人的设置,并且以 bin/rails db:setup
开头.
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
但是 Docker 人员确实需要以下内容——最重要的是不同的主机——并且它将以 docker-compose run web bin/rails db:setup
开头.由于主机现在不同了这个 database.yml
对本地人来说不再适用。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
同时涵盖这两个用例的最方便或侵入性较小的方法是什么?我可以动态获取主机值吗?如何?来自环境变量?来自不同的 database.yml?然后如何告诉 Rails 取而代之?
注意:Docker 设置基本上遵循https://docs.docker.com/compose/rails
最佳答案
使用环境变量 Luke。
ENV['DATABASE_URL']
与 database.yml
中的设置合并,并优先于文件中的值。
为避免开发者大战,database.yml
应仅包含最低限度的设置,例如适配器、编码和数据库的默认名称:
default: &default
adapter: postgresql
encoding: unicode
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
主机、密码等任何其他内容都应由 ENV['DATABASE_URL']
设置,因为这是本地配置 - 不是应用程序配置。出于安全原因,这也是可取的,因为它消除了密码随源代码泄露的风险。
参见:
关于ruby-on-rails - 如何配置 database.yml 以在本地环境和 Docker 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49038091/