Я пытаюсь докеризовать свое существующее приложение рельсов. Я уже довольно давно использую credentials.yml. Мой файл credentials.yml выглядит примерно так:
production:
db_host: 'localhost'
db_name: 'prod_db'
db_username: 'username'
db_password: 'password'
development:
db_host: 'localhost'
db_name: 'dev_db'
db_username: 'username'
db_password: 'password'
test:
db_host: 'localhost'
db_name: 'test_db'
db_username: 'username'
db_password: 'password'
secret_key_base: my_secret_key_base
И мой файл database.yml выглядит так:
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: <%= Rails.application.credentials[Rails.env.to_sym][:db_name] %>
username: <%= Rails.application.credentials[Rails.env.to_sym][:db_username] %>
password: <%= Rails.application.credentials[Rails.env.to_sym][:db_password] %>
host: <%= Rails.application.credentials[Rails.env.to_sym][:db_host] %>
template: template0
test:
<<: *default
database: <%= Rails.application.credentials[Rails.env.to_sym][:db_name] %>
username: <%= Rails.application.credentials[Rails.env.to_sym][:db_username] %>
password: <%= Rails.application.credentials[Rails.env.to_sym][:db_password] %>
host: <%= Rails.application.credentials[Rails.env.to_sym][:db_host] %>
template: template0
production:
<<: *default
database: <%= Rails.application.credentials[Rails.env.to_sym][:db_name] %>
username: <%= Rails.application.credentials[Rails.env.to_sym][:db_username] %>
password: <%= Rails.application.credentials[Rails.env.to_sym][:db_password] %>
host: <%= Rails.application.credentials[Rails.env.to_sym][:db_host] %>
template: template0
Теперь я не использую docker swarm, поэтому я не смогу использовать секреты докеров. Поскольку изображение postgres требует настройки переменных среды, как мне предоставить учетные данные, не встраивая их в файл docker-compose?
Вот образец моего файла docker-compose.yml:
version: '3'
volumes:
postgres_data: {}
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
stdin_open: true
tty: true
depends_on:
- db
volumes:
- .:/my_app
db:
image: postgres:10.3
volumes:
- postgres_data:/var/lib/postgresql/data
Вы можете использовать ENV['DATABASE_URL']
для настроить подключение к базе данных вместо того, чтобы возиться с файлом учетных данных.
Например:
DATABASE_URL=postgresql://localhost/foo?username=bar&password=baz rails s
Значения в ENV['DATABASE_URL']
объединены со значениями в database.yml
, поэтому вы можете просто установить некоторые полезные значения по умолчанию:
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
template: template0
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_test
Вы можете установить env var для разработки в конфигурация контейнера. И производственные учетные данные непосредственно на сервере или, если вы используете службу SAAS, такую как heroku, через конфигурацию приложения.
Я думаю, что докер уже предоставляет имя пользователя и пароль как env vars. docs.docker.com/samples/library/postgres/#postgres_password