はじめに
Nginxの公式イメージを使用する場合にCMDの記述の仕方によって正常に動作しない場合があるのでその理由と対処について以下に記述します。
CMDの先頭は/usr/sbin/nginxではなくnginx
CMDの先頭を/usr/sbin/nginxとするとDockerコンテナ内の/docker-entrypoint.shが正常に機能しないことがあります。
そのためCMDの先頭は/usr/sbin/nginxではなくnginxとする必要があります。
公式イメージの/docker-entrypoint.sh内に次のような記述があります。
...
if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then
...
シェルスクリプトの$1は1つ目の引数を表します。
Dockerfile内でENTRYPOINT [ "/docker-entrypoint.sh" ]と記述されているので、CMDの記述は/docker-entrypoint.shの引数となります。
よって上記条件式の$1はCMDの先頭を表します。
CMDの先頭がnginxまたはnginx-debugでないとこの条件式の中の処理は実行されません。
この条件式の中で/docker-entrypoint.d/配下のファイルが実行されるためCMD ["/usr/sbin/nginx", "-g", "daemon off;"]などとするとこれらのファイルが実行されません。
/docker-entrypoint.d/に配置されるファイルは次の3つです。
20-envsubst-on-templates.shは設定ファイル内で環境変数を使用するための処理が記述されています。
CMDを/usr/sbin/nginxで始めてしまうとこのファイルが実行されず、環境変数が展開された設定ファイルが作成されません。
上記のことからCMDは/usr/sbin/nginxではなくnginxで始める必要があります。
また以上のことはcompose.ymlのcommandやコンテナ起動時にコマンドを指定する場合も同様です。