假设我的一些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
什么是最方便或更少侵入性的方式同时涵盖两个用例?我可以动态获取主机值吗?怎么样?从env变量?来自不同的database.yml?那么如何告诉Rails取而代之呢?
注意:Docker设置基本上遵循https://docs.docker.com/compose/rails
ENV['DATABASE_URL']
与database.yml
的设置合并,优先于文件中的值。
为了避免开发者大战,database.yml
应该只包含最少的设置,例如适配器,编码和DB的默认名称:
default: &default
adapter: postgresql
encoding: unicode
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
其他任何东西,如主机,密码应由ENV['DATABASE_URL']
设置,因为这是本地配置 - 而不是应用程序配置。出于安全原因,这也是优选的,因为它消除了密码被源代码泄露的风险。
看到:
只需从database.yml
安装第二个特定于docker的docker-compose.yml
:
version: '3'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
- ./docker/database.yml:/myapp/config/database.yml # Here we go!
ports:
- "3000:3000"
depends_on:
- db