NginxをDockerコンテナーにインストールし、次のように実行しようとしています。
docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx
問題は、Nginxの動作方法であり、初期プロセスがすぐにマスターNginxプロセスと一部のワーカーを生成し、その後終了することです。 Dockerは元のコマンドのPIDのみを監視しているため、コンテナーは停止します。
コンテナが停止しないようにするにはどうすればよいですか?最初の子プロセスにバインドするように指示するか、Nginxの初期プロセスの終了を停止する必要があります。
nginx
は、すべての行儀の良いプログラムと同様に、自己デーモン化しないように構成できます。
http://wiki.nginx.org/CoreModule で説明されているdaemon off
設定ディレクティブを使用します。
Charles Duffyの答えを拡張するために、Nginxはdaemon off
ディレクティブを使用してフォアグラウンドで実行します。これを構成ファイルに入れるのが不便な場合は、コマンドラインで直接指定できます。これにより、デバッグモード(フォアグラウンド)での実行が容易になり、コマンドライン引数を変更して本番モード(バックグラウンド)での実行に直接切り替えることができます。
フォアグラウンドで実行するには:
nginx -g 'daemon off;'
バックグラウンドで実行するには:
nginx
ジョンの答えを拡張するには、次のようにDockerfile
CMD
コマンドを使用することもできます(追加の引数なしで自己開始する場合)。
CMD ["nginx", "-g", "daemon off;"]
このコマンドをDockerfileに追加すると、無効にすることができます。
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ここに、nginxを実行するDockerfileの例があります。 Charlesが言及したように、daemon off
設定を使用します:
https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17
サービス管理には、supervisordまたはrunit [1]を使用することもお勧めします。
TomerとCharlesの回答を追加するには、
Entrypointを使用してDockerコンテナーのフォアグラウンドでnginxを実行する構文:
ENTRYPOINT nginx -g 'daemon off;'
直接関係ありませんが、Entrypointで複数のコマンドを実行します。
ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;'