Dockerコンテナを作るときに環境変数を使ってテンプレートから設定ファイルを作成します。
やりたいことは、次の2つなのですが、手軽な方法が見つかりません。
- 環境変数が設定されていたら、それを使う
- 環境変数がなければ、デフォルト値を使う
結局、ansibleのJinja2を使って次のようにしました。
テンプレートとplaybook
下記のようにテンプレートのtest.cfgとplaybookのmain.yamlを準備します。
$ cat templates/test.cfg test={{ aaa }} $ cat main.yaml --- - name: setup proxy hosts: all vars: aaa: "{{ lookup('env', 'AAA') | ternary(lookup('env', 'AAA'), 'default value') }}" tasks: - name: test debug: msg="value is {{ aaa }}" - template: src: test.cfg dest: /tmp/test.cfg $
動作確認
環境変数がなければ、ternaryのfalse側の値がデフォルト値として採用され、環境変数が定義されていれば、環境変数の値が埋め込まれます。
$ ansible-playbook -i "localhost," -c local main.yaml > /dev/null && cat /tmp/test.cfg test=default value $ AAA="env value" ansible-playbook -i "localhost," -c local main.yaml > /dev/null && cat /tmp/test.cfg test=env value $
下記のような不満は、ちょっとありますが、一番良さそう。
- 環境変数の表現が長い(lookup(env, “環境変数”)には省略形がほしい)
- デフォルト値のternaryには、ちょっと馴染めない。
- varsへの設定ではなく、テンプレート側に埋め込みたい
他に試した方法
envsubst
envsubstコマンドは、aptでインストール可能で、環境変数を${変数名}で置換するので最有力でしたが、デフォルト値が設定できなかったり、エスケープの問題が解決できず断念しまいた。
entrykit
DockerのEntrypointのための専用ツール、Jinja2風のテンプレート表記でデフォルト値の設定も可能と機能的には申し分なしでしたが、パッケージからのインストールができず、curl + tarが残念、また、Entrypointの表記が、ちょっと受け入れられなかった。
以上