Approvers

Docker版Nginxの環境変数を設定ファイルに展開する機能を使おうとしたら詰まった

loxygen -

あけましておめでとうございます、フライさんです。
ブログ機能があるのに誰も投稿してないので、せっかくならということで書いてみます 📝

🚴 TL;DR

  • /etc/nginx/templates/に置くファイルの拡張子は.conf.templateにしなきゃダメ

🗃️ Template 機能

(Template 機能は正式な名前ではないですが便宜上こう呼びます)
もともとの nginx にはない機能ですが、Docker 版の nginx には環境変数の中身を設定ファイルに展開するというイカした機能があります。

listen ${NGINX_LISTEN_PORT};

こんな風に書くと環境変数が展開されます。

こんな感じで書いた設定テンプレートファイルを/etc/nginx/templates/ディレクトリに XXX.templateという形式のファイル名でコンテナ内に配置すると、 コンテナが起動したときに、環境変数が展開された設定ファイルが展開され、/etc/nginx/conf.dXXXという名前で配置されます

(/etc/nginx/templates/web-server.conf.template/etc/nginx/conf.d/web-server.conf といった具合に)

🤦 動かない

ある PJ で nginx をこねこねしていたときこれを知り、 「こりゃ便利だ、使ってみよう」 となったので、 conf.templateを作成し/etc/nginx/templates/にぶん投げ、コンテナ起動。

ぼく「さぁ、できてるかな?」
ぼく「http://localhost:12739/login[1]オラァッ!!!!!!!!!!!!!!!!!!!!!

Docker コンテナ「404 Not found

ぼく「ンヒィッ

🤔 なんでよ

🔍 原因を探る

いろいろ原因を洗い出してみて、調査してみましたが…

  • 展開されてない? (テンプレートファイル置く場所ミスとかファイル名ミスとか)
    ➡️ コンテナ内の/etc/nginx/conf.dconf という名前で展開されてた
    ➡️ 加えてdockerのログにも「conf.templateを展開したぜ!」というログが出てた

  • 設定ファイルがおかしい?
    ➡️ /etc/nginx/nginx.confを上書きして環境変数を手動で展開して動かしてみたら動いた

  • あえて構文ミスさせてみる
    ➡️ エラーログは観測できず

ということは、設定ファイルが読み込まれてないということになります。

🏄 読み込まれない原因を探る

ググったり/etc/nginx/conf.dの中身をつんつんしたりしてもなかなか動かない中、 /etc/nginx/nginx.confにある記述を見つけました。

include  /etc/nginx/conf.d/*.conf;

ファイル名の最後に .conf がつくファイルが読み込まれることが見て取れますね。

そういえば、展開されたファイルの名前は conf でしたが…んっ?

🤸 そして問題解決へ

コンテナにぶん投げるファイルの名前をconf.templateから**web.conf.templateへリネーム**、 コンテナへぶん投げました。結果…

nginx「あーーーー待て、web.confにセミコロンないやん、ダメ!起動できません!

ぼく「ッッッッッウシッッッッッッッッッッッッッッッッッッッッッッッッッッッ!!!!!!!!!!!!!!!!!!!!!!!!!!!

ちゃんと読み込めました

📖 わかったこと

  • /etc/nginx/templates/に置くファイル名の拡張子は.conf.template
    .templateを消したときに、拡張子が.confになれば OK。app.set.templateとかは拡張子が.setになるのでダメです
  • 設定ファイルに適当な名前をつけるのはやめたほうがいい

👋 おわりに

初ブログがお粗末になってしまった、またリベンジしたいと思います。


  1. 12739 は適当に決めたポート番号です。キーボードの数字キーの上に指を添え、同時にすべてのキーを押して決めます。 ↩︎