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

问题描述 投票:4回答:2

假设我的一些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

ruby-on-rails database docker
2个回答
1
投票

使用ENV vars Luke。

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']设置,因为这是本地配置 - 而不是应用程序配置。出于安全原因,这也是优选的,因为它消除了密码被源代码泄露的风险。

看到:


0
投票

只需从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
© www.soinside.com 2019 - 2024. All rights reserved.