Dockerで利用する環境変数をenv_fileを利用して一元管理する方法

インフラ

こんにちは。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アプリを利用します。

環境構築からデータ作成まで!Rails x MySQLのDocker Compose環境構築手順

2019年8月8日

サンプルとして利用する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)のフォローもよろしくお願いします!