2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

.envを扱いたいみなさん

Posted at

なんとなく、みんな .env 好きだなーと思ったので .env について書いてみる。

.env とは

下記のように KEY=VALUE の改行区切りで書かれた設定値を、環境変数として展開する様式美のこと。

.env
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 だったはず
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?