motivation
色々な仕組みを作るときにテンプレートエンジンが欲しくなることがあると思いますが、 あまり仰々しい感じの仕組みを利用したくない、(or インストールしたくない)ということはあると思います。
kubernetes(k8s)の設定ファイルのパラメータを環境ごとに入れ替えたり、 Appengineのapp.yamlの値を環境ごとに差し替えたい、ということもあるかもしれません。
そんなときに気軽に使えるのがenvsubst。 k8sのconfigにはkustomize( https://kustomize.io/ )という手もありますが。。
envsubstの使い方
envsubstコマンドの基本としては以下のように利用します
テンプレートファイルは以下のイメージです
cat template.txt ${HELLO} ${WORLD}
実行コマンドは以下のようになります
export HELLO=hello export WORLD=world envsubst < template.txt // hello world
という感じで、環境変数に定義していた値でtemplateファイルのプレースホルダを置き換えます。
使い方は簡単ですが、envsubstコマンドのインストールが必要です。
インストールせずにenvsubstを利用する
envsubstをインストールしたくないのでDockerをインストールするのか!という突っ込みはありそうですが、 CI/CD環境などでの利用を想定しています。
今回利用するコンテナは supinf/envsubst というものを使ってみます。 DockerhubのURLは https://hub.docker.com/r/supinf/envsubst で、 Githubでは https://github.com/supinf/dockerized-tools/tree/master/cli-tools/envsubst/versions/0.x でどのようなものか確認できます。
利用1 : 環境変数もファイルとして値を与える
以下のようなテンプレートファイルを用意します。
cat template.txt ${A} ${B}
環境変数ファイルとして以下のようなファイルを用意します
cat env.txt A=foo B=bar
Dockerコマンドでenvsubstを実行すると以下のような結果が得られます。
% docker run --rm -it -v $(pwd):/tmp supinf/envsubst /tmp/template.txt /tmp/env.txt foo bar
こちら のentrypoint.shを見るとわかりますが、第一引数にはテンプレートファイルを取り、第二引数が存在する場合にはenvファイルを利用するというふるまいになっています。
利用2 : 環境変数を直接渡す
先程のテンプレートファイルをそのまま利用します。
Dockerコマンドで環境変数を渡しながらenvsubstコマンドを以下のように実行します。
% docker run --rm -it -v $(pwd):/tmp -e A=FOO -e B=HOGE supinf/envsubst /tmp/template.txt FOO HOGE
-e
オプションで渡した環境変数の値がテンプレートに差し込まれて出力されていることがわかります。
追記 : docker実行したenvsubstから生成ファイルを取得する
docker run --rm -it -v $(pwd):/tmp -e A=FOO -e B=HOGE supinf/envsubst /tmp/template.txt >| config.txt
まとめ
このような形で、環境ごとに設定ファイルのパラメータの変更をしたいなどという場合に、envsubstをインストールせずとも(or インストールできない環境でも)テンプレートファイルの処理が簡単に行なえます。