Overview
たとえば環境変数を json から読み込みたいとき。
お困り事例
たとえばこんな json を
env.json
{
"DB_HOST": "mysql.example.com",
"DB_NAME": "sampledb",
"DB_PASSWORD": "password",
"DB_USER": "user",
"VAR1": "val1",
"VAR2": "val2",
"VAR3": "val3"
}
環境変数にしたい時ってあるじゃないですか。
bash
$ echo $DB_HOST
mysql.example.com
$ echo $DB_NAME
sampledb
解
こんな感じで変換すると
to-env.jq
{DB_HOST, DB_NAME, DB_PASSWORD, DB_USER}
| to_entries[]
| [.key, .value]
| join("=")
こうなるので、
$ jq -r -f to-env.jq env.json
DB_HOST=mysql.example.com
DB_NAME=sampledb
DB_PASSWORD=password
DB_USER=user
これを export
の引数に渡してやると、いい感じになる。
bash
$ export $(jq -r -f to-env.jq <env.json)
$ env | grep -e DB_HOST -e DB_NAME -e DB_USER -e DB_PASSWORD
DB_PASSWORD=password
DB_USER=user
DB_HOST=mysql.example.com
DB_NAME=sampledb
$ echo $DB_HOST
mysql.example.com
駄目な例:その1
なお、シェル変数にしようと思って export
をつけないと、思惑通りにいかず、エラーになるので注意。
bash
$ $(jq -r -f to-env.jq <env.json)
-bash: DB_HOST=mysql.example.com: コマンドが見つかりません
駄目な例:その2
あと、値にホワイトスペースが入ってると駄目なので、
bash
$ jq -r -f to-env.jq env.json
DB_NAME="sample db"
$ export $(jq -r -f to-env.jq env.json)
-bash: export: `db'': 有効な識別子ではありません
素直に一度ファイルに落とすなどして対応するとよいと思う。
bash
$ jq -r -f to-env.jq env.json >.env
$ . .env && echo "$DB_NAME"
sample db
ワンライナー
&&
で繋げば1行でもいける。
bash
$ export $(jq -r -f to-env.jq <env.json) && echo $DB_HOST
mysql.example.com
Dockerfile
とか Makefile
とか、どうしても1行に詰め込まないとならないときに。
応用:ファイルに埋め込む
envsubst
と合わせると
cnf.tpl
[client]
host=${DB_HOST}
port=3306
user=${DB_USER}
password=${DB_PASSWORD}
[mysql]
database=${DB_NAME}
簡易テンプレートエンジンみたいなことができちゃったり。
bash
$ export $(jq -r -f to-env.jq env.json) && envsubst <cnf.tpl
[client]
host=mysql.example.com
port=3306
user=user
password=password
[mysql]
database=sampledb
っていう話。