LoginSignup
1
0

More than 1 year has passed since last update.

json の値を環境変数に設定する話

Posted at

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

っていう話。

1
0
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
1
0