Edited at

Rails & docker-compose のマイクロサービスで開発する時に環境変数の設定はどうしてるんだろう

CIを回すためのRSpecやRuboCop環境を整えていく中で、つい昨日まで開発環境が「不便だなぁ」と感じていたこと、皆さんはどのように解決しているのか気になったので投稿してみました。


今携わっているプロジェクトの開発環境


  • Ruby 2.5.3

  • Rails 5.2.1

  • docker-compose version 1.23.1

  • docker-compose.yml version '2'

  • 20個近くの独立したDockerコンテナ


    • Railsが動いていたり

    • lambdaのモックがあったり

    • S3のモックがあったり




不便だなぁと感じていたところ


  • RSpecやRuboCopを回すためにDockerコンテナに docker exec -it hoge-container bash で入り、bundle exec guard --force-polling で監視しながら結果を逐次確認する作業が必要になる

  • Railsの起動には色々な環境変数の設定が必要で、環境変数はdocker-compose.ymlに一元管理されている


    • 自分のマシンは MacBook なのでterminal-notifierを使ってRSpecやRuboCopの結果を見たいが、ローカル環境でguardを立ち上げるために、毎回Dockerコンテナ毎の環境変数を設定しなくてはならない

    • Dockerコンテナでguardを立ち上げたり回したりすると重い & 遅い。Dockerコンテナ上だとterminal-notifierが使えない



  • RSpecやRuboCop用のguardコンテナを別途立ち上げるのも検討したが、


    • terminal-notifierが使えない

    • コンテナが増えることでマシンの負荷が増える

    • guardのREPL?が使えない

    • ログがdocker-compose logs に紛れる



など、自分の知識が足りないだけでもっといい方法があるような気がしますが、

昨日までこのようなモヤモヤを持ちながらひたすらに開発を進めていました。


(自分の中では)解決策

自分と自分以外の人が開発しやすく、環境を共有しやすい方法が無いか昨日の夜から真剣に一晩悩んで、今朝試してみたところうまくいきそうだったので一気に環境を作り、夜になった今ではかなり快適になったので、ここにその解決法を残しておきます。

あくまで自分の印象として快適になった、というだけでまだ自分以外に共有されていないので、周りの反応は来週以降にならないとわかりません。


docker-compose.yml を読み込んで Rails 内で環境変数を設定する gem を作った

docker_compose_yaml_loader です。

プロジェクトの開発環境ではエラーや不具合がないレベルでしか作られていないので、もしかするとうまく処理できないことがあるかもしれませんが、今のところ問題なく動いています。


使い方

Gemfile

group :development, :test do

gem 'docker_compose_yaml_loader'
end

config/test.rb


config/test.rb

DockerComposeYamlLoader::Environments.setup(Rails.root.join('./docker-compose.yml'), key: 'webapp') do |env|

env.set('DATABASE_HOST', '127.0.0.1') # docker-compose.ymlのままだと動かない設定は、上書きできる
env.set('DATABASE_PORT', '13306')
end

これだけの設定で、docker-compose.ymlの設定を流用でき、重複定義にならず定義場所が散らばらないようにできました


上記の解決方法がベストなのかどうか、今でも自信がありません。

皆さんの開発環境ではどのような設定やツールでストレスの少ない開発環境を実現しているのか、コメントしていただけるととても嬉しいです。

乱筆・乱文なのは重々承知の上で、記事を投稿してしまうことを何卒お許しください。