如何配置 database.yml 以在本地环境和 Docker 中工作?

ley*_*nnx 6 database ruby-on-rails docker

假设我的一些 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
Run Code Online (Sandbox Code Playgroud)

但是 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
Run Code Online (Sandbox Code Playgroud)

同时涵盖两个用例的最方便或侵入性较小的方法是什么?我可以动态获取主机值吗?如何?从环境变量?来自不同的database.yml?那么如何告诉 Rails 取而代之呢?

注意:Docker 设置基本上遵循https://docs.docker.com/compose/rails

max*_*max 4

使用 ENV 变量 Luke。

ENV['DATABASE_URL']与设置合并database.yml并优先于文件中的值。

为了避免开发人员的战争,database.yml应该只包含最低限度的设置,例如适配器、编码和数据库的默认名称:

default: &default
  adapter: postgresql
  encoding: unicode

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test
Run Code Online (Sandbox Code Playgroud)

其他任何内容(例如主机、密码)都应由ENV['DATABASE_URL']因为这是本地配置 - 而不是应用程序配置。出于安全原因,这也是更可取的,因为它消除了源代码泄露密码的风险。

看: