寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

シンプルなテンプレートエンジンのenvsubstをインストールせずに使う

f:id:chidakiyo:20190719143057j:plain

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 インストールできない環境でも)テンプレートファイルの処理が簡単に行なえます。