こんにちは、ちゃりおです。
node-configを使えば、簡単に環境情報を切り替えることができます。
具体的には、NODE_ENV環境変数にセットした値のファイル名を、読み込んでデプロイなどができます。
node-config触ってみた
お試し用の環境
検証用にDockerで環境作ってみました。
リポジトリからpullして、ローカルで「docker build」します。
docker build sample-node-config
フォルダ構成
├── Dockerfile
├── config
│ ├── default.json
│ ├── development.json
│ ├── local-docker.json
│ └── production.json
├── index.js
└── package.json
NODE_ENVになにも設定しない
なにも設定しない場合はdefaultではなく、developmentが読み込まれます。
github node-config Configuration Files
If NODE_ENV is not set in the environment, a default value of development is used.
% docker run sample-node-config
NODE_ENV=undefined
{"message":"This is a development config"}
NODE_ENVにproductionを設定
想定通りに、productionが読み込まれます。
% docker run -e NODE_ENV="production" sample-node-config:latest
NODE_ENV=production
{"message":"This is a production config"}
NODE_APP_INSTANCEを設定
「NODE_ENV」の他に「NODE_APP_INSTANCE」という環境変数も使えます。
(他にもありますが、ハマった原因がこれだったため)
インスタンス固有の設定を読み込みたいときに使うようです。
(例えば、「stage-1.json」「stage-2.json」などに分けたい場合)
下記では、「local-docker」が読み込まれました。
% docker run -e NODE_APP_INSTANCE="docker" sample-node-config:latest
NODE_ENV=undefined
{"message":"This is a local docker config"}
ハマった点 環境変数が読み込まれる順序
「NODE_APP_INSTANCE」と「NODE_ENV」どっちも設定してみました。
「production」読んで欲しかったのですが「local-docker」のほうが読み込まれていました。
% docker run -e NODE_APP_INSTANCE="docker" -e NODE_ENV="production" sample-node-config:latest
NODE_ENV=production
{"message":"This is a local docker config"}
node-configのwikiで読み込み順をみてました。
default.EXT
default-{instance}.EXT
{deployment}.EXT
{deployment}-{instance}.EXT
{short_hostname}.EXT
{short_hostname}-{instance}.EXT
{short_hostname}-{deployment}.EXT
{short_hostname}-{deployment}-{instance}.EXT
{full_hostname}.EXT
{full_hostname}-{instance}.EXT
{full_hostname}-{deployment}.EXT
{full_hostname}-{deployment}-{instance}.EXT
local.EXT
local-{instance}.EXT
local-{deployment}.EXT
local-{deployment}-{instance}.EXT
(Finally, custom environment variables can override all files)
上から読まれて、下のもので上書きされます。
{deployment}には「NODE_ENV」で指定した値が入ります。
そのため、「production.json」は3つ目({deployment}.EXT})で一致して読み込まれました。
しかし、更にあとに「local-{instance}.EXT」があります。
{instance}の値には、「NODE_INSTANCE_NAME」の値が入るため「local-docker.json」で上書きされました。
「{deployment}.EXT」を読みたいときは、「local-{instance}.EXT」が読み込まれないように「NODE_INSTANCE_NAME」に値を入れないまたは、「local-*.EXT」を作らない必要があります。
(「local-」がつくものは、github上で管理しないことをnode-configのwikiにも書いてあった気がします)
まとめ
今回は、node-configを触ってみました。
github上のコードをデプロイしようとして、ファイルの読み込み順でハマって想定したconfigが読み込まれないことがありました。
node-configの動作を理解していないため、解決まで時間がかかりました。
wiki読むのは大事ですね。