はじめに
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
やコンテナ起動時にコマンドを指定する場合も同様です。