公式nginxイメージの置換機能
Dockerの公式nginxイメージには envsubst(1) コマンドを使った設定ファイルの置換機能が組み込まれている。envsubst(1) それ自体は gettext のために作られたコマンドらしい。
デフォルトでは /etc/nginx/templates 以下に .template 拡張子を付けて保存したファイルが対象となるが、以下の環境変数で設定を変更できる。
ENV NGINX_ENVSUBST_TEMPLATE_DIR=/opt/config/nginx/templates \ NGINX_ENVSUBST_OUTPUT_DIR=/opt/config/nginx \ NGINX_ENVSUBST_TEMPLATE_SUFFIX=.template対象となるディレクトリはひとつしか与えられないけれど、サブディレクトリも含めて置き換えていくので、対象としたい複数のディレクトリがすべて含まれるルートディレクトリを設定すればよい。
置き換え操作は $name または ${NAME} 形式のプレースホルダーを環境変数で置換する。このとき envsubst(1) 自体は大文字小文字を区別しないし、環境変数がなければ空文字となるが、nginx イメージでは事前に存在する環境変数だけを置換対象としているのでうまく動作する。例えば以下の場合、
if($access_from = xxx){ set $dir "$NAME";}素朴な envsubst の実行であれば access_from や dir も置換してしまう。しかし本来は nginx の変数であろう。しかし公式イメージでは「存在している環境変数」だけが置換対象となるため、上記の access_from や dir などはそのまま残り1、正しく動く。
Footnotes
Section titled “Footnotes”-
たまたま環境変数に dir などがあれば置き換えられてしまうのだが ↩