こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。
前回、『環境構築からデータ作成まで!Rails x MySQLのDocker Compose環境構築手順』の記事でMySQL x Ruby on RailsのシステムをDocer Composeを利用してDocker環境に構築する手順について紹介しました。
Docker環境でDBに接続する場合、DBの接続設定をDocker環境で読み込ませる必要があります。
今回はdocker-compose.ymlのenv_file
を利用して、パスワードやユーザー名といった環境変数をDockerの設定ファイルとは別で管理する方法について紹介します。
(リファクタ前)環境変数がハードコーディングされたRailsアプリ
今回はサンプルとして以下の記事で作成したRailsアプリを利用します。
サンプルとして利用するRubyアプリの全体像
DB接続に関する設定ファイルは以下のようになっています。
config/database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: pass
host: db
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- '3000:3000'
volumes:
- .:/rails_app
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'pass'
(リファクタ後)環境変数を別ファイルで管理するようにしたRailsアプリ
docker-compose.ymlにはenv_fileというオプションが用意されています。
env_fileを利用することで、指定されたファイル内に記載されている環境変数をDocker環境にセットすることができます。
今回は環境変数用のファイルとしてdevelopment.envというものを用意してみます。
development.env
DB_USERNAME=root
DB_PASSWORD=pass
DB_HOST=db
MYSQL_ROOT_PASSWORD=pass
development.envに用意した環境変数を読み込むようにするためには以下のように修正します。
config/database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
- username: root
+ username: <%= ENV.fetch('DB_USERNAME', 'root') %>
- password: pass
+ password: <%= ENV.fetch('DB_PASSWORD', 'pass') %>
- host: db
+ host: <%= ENV.fetch('DB_HOST', 'db') %>
↑ENV.fetch()
は第一引数に環境変数、第二引数にデフォルト値をセットすることで『環境変数がある場合は環境変数、なければデフォルト値』を返します。
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- '3000:3000'
volumes:
- .:/rails_app
depends_on:
- db
+ env_file: development.env
db:
image: mysql:5.7
- environment:
- MYSQL_ROOT_PASSWORD: 'pass'
+ env_file: development.env
以上で環境変数を別ファイルで管理することができるようになりました。
まとめ: 環境変数はDockerファイル・docker-compose.ymlとは別で管理しよう
以上でenv_fileを利用した環境変数の管理方法の紹介を終わります。
チーム開発をする際に『Dockerファイルやdocker-compose.ymlは共有したいけど、環境変数は各自のローカル環境で管理したい』という場合は環境変数を管理するファイル(今回のdevelopment.env)を.gitignore
に追加するとよいでしょう。
環境変数をDockerファイルと別で管理することでセキュアに開発環境を構築することが可能になります。
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!