なんとなく、みんな .env 好きだなーと思ったので .env について書いてみる。
.env とは
下記のように KEY=VALUE の改行区切りで書かれた設定値を、環境変数として展開する様式美のこと。
KEY1=VALUE1
KEY2=VALUE2
:
色々な言語で dotenv
というライブラリが存在する。さほど調べてないが大体ある。
どれも共通して .env
ファイルを読み込んで、環境変数に設定するところまでをやってくれる。
.env の功罪
人には、OS固有の設定や特定のフォーマットの設定ファイルに依存せず、ふわっとした環境変数をI/Fとして入力値を受け取りたい、という気持ちがある。
そこで .env
を使うことで、設定を管理しつつ環境変数をI/Fにすることができる。
ただ、よくある間違った使い方として dotenv
ライブラリに依存した処理を書いてしまうということがある。
クリーンアーキテクチャーおじさんは、「mainは詳細である」と言った。
mainで dotenv
を使ってお膳立てをしたなら、あとの処理ではお膳からご飯を食べるべきである(?)。
例えば、node.jsで dotenv
を使うなら、このように起動時に読み込む方法がある。
$ node -r dotenv/config index.js
あと本番環境では使わんだろ普通、と思ってる。
言語別の.env
bash
bashでも .env
ファイルを読みたいことがある。
env 環境変数名=値 コマンド
を使って下記のようにできる。
もっとかっこいいやり方があるかも。
$ env $(cat .env | xargs) ./main.sh
Ruby
元祖(?)なので当然 dotenv
がある。
dotenv-rails
という gem もあり、.env.production
など置いておくと環境ごとに読み込んでくれそう。
JavaScript
さっき書いたようにこんな感じで使う。
$ node -r dotenv/config index.js
Go
あった。
だんだんbashで設定できるならいらない気がしてきた。
Docker
気を取り直して Docker も見てみる。
--env-file
オプションで指定することができる。
$ docker run $image --env-file .env
Docker Compose も .env
に対応している。
services:
app:
environment:
- ENV_KEY1="ENV_VALUE1" # 直接設定
- ENV_KEY2 # 実行環境の環境変数をパススルー
env_file:
- .env # .envファイルから読み込み
image:
- "image:${ENV_KEY3}" # 環境変数を早速使用
まとめ
- 環境変数は再起動しないと読み込み直せなかったりするので気をつけて使ったほうがいい
-
dotenv
はうっかり依存しがちなので、使い方に気をつけたほうがいい - 本番環境では、環境変数を渡す方法がいくらでもあるので
dotenv
いらないと思う - そもそも、本番環境で
dotenv
使わないためのdotenv
だったはず