プログラミング

node-config触ってみた NODE_APP_INSTANCEでハマった

node

こんにちは、ちゃりおです。

node-configを使えば、簡単に環境情報を切り替えることができます。
具体的には、NODE_ENV環境変数にセットした値のファイル名を、読み込んでデプロイなどができます。

node-config触ってみた

お試し用の環境

検証用にDockerで環境作ってみました。

リポジトリからpullして、ローカルで「docker build」します。

docker build sample-node-config

参考 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読むのは大事ですね。

slack通知
Webhookを使ってシェルスクリプトで手軽にslack通知するこんにちは、ちゃりおです。 アラートとかをslackに通知するのとても便利ですよね。 今回はシェルスクリプトでslackに通知する方法...
DockerでLAMP環境を作ったら、PDO接続できなくてハマった件DockerでLAMP環境環境作ったら、phpのpdoからデータベースに接続できずハマった件です。 DockerにPDOがインストールできていない。 次は、以下のエラーではまりました。 ERROR:SQLSTATE[HY000] [2002] No such file or directory...
dokcer k8s
Docker本 最初の一冊に「【書評】Docker/Kubernetes 実践コンテナ開発入門」こんにちは、ちゃりおです。 「Docker/Kubernetes 実践コンテナ開発入門」の書評です。 以下の人におすすめです。 ...