web-dev-qa-db-ja.com

停止せずにDockerコンテナ内でNginxを実行するにはどうすればよいですか?

NginxをDockerコンテナーにインストールし、次のように実行しようとしています。

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

問題は、Nginxの動作方法であり、初期プロセスがすぐにマスターNginxプロセスと一部のワーカーを生成し、その後終了することです。 Dockerは元のコマンドのPIDのみを監視しているため、コンテナーは停止します。

コンテナが停止しないようにするにはどうすればよいですか?最初の子プロセスにバインドするように指示するか、Nginxの初期プロセスの終了を停止する必要があります。

96
Seldo

nginxは、すべての行儀の良いプログラムと同様に、自己デーモン化しないように構成できます。

http://wiki.nginx.org/CoreModule で説明されているdaemon off設定ディレクティブを使用します。

136
Charles Duffy

Charles Duffyの答えを拡張するために、Nginxはdaemon offディレクティブを使用してフォアグラウンドで実行します。これを構成ファイルに入れるのが不便な場合は、コマンドラインで直接指定できます。これにより、デバッグモード(フォアグラウンド)での実行が容易になり、コマンドライン引数を変更して本番モード(バックグラウンド)での実行に直接切り替えることができます。

フォアグラウンドで実行するには:

nginx -g 'daemon off;'

バックグラウンドで実行するには:

nginx
129
johntellsall

ジョンの答えを拡張するには、次のようにDockerfileCMDコマンドを使用することもできます(追加の引数なしで自己開始する場合)。

CMD ["nginx", "-g", "daemon off;"]
42
Tomer Ben David

このコマンドをDockerfileに追加すると、無効にすることができます。

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
7

ここに、nginxを実行するDockerfileの例があります。 Charlesが言及したように、daemon off設定を使用します:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

5
creack

サービス管理には、supervisordまたはrunit [1]を使用することもお勧めします。

[1] https://github.com/phusion/baseimage-docker

3
Kunthar

TomerとCharlesの回答を追加するには、

Entrypointを使用してDockerコンテナーのフォアグラウンドでnginxを実行する構文:

ENTRYPOINT nginx -g 'daemon off;' 

直接関係ありませんが、Entrypointで複数のコマンドを実行します。

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
1
Nitb