3

Supervisord を使用して Docker で tomcat コンテナーを構築しています。Dockerfile のデフォルト コマンドが

CMD supervisord -c /etc/supervisord.conf

docker stop コマンドをディスパッチすると、コンテナーは終了コード 0 で正常に終了します。

しかし、代わりに私が持っている場合

CMD ["/run"] 

そしてrun.shで、

supervisord -c /etc/supervisord.conf

docker stop コマンドを実行すると、終了コード -1 が返されます。ログを表示すると、supervisord が終了要求を示す SIGTERM を受信して​​いないようです。

2014-10-06 19:48:54,420 CRIT Supervisor running as root (no user in config file)
2014-10-06 19:48:54,450 INFO RPC interface 'supervisor' initialized
2014-10-06 19:48:54,451 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2014-10-06 19:48:54,451 INFO supervisord started with pid 6
2014-10-06 19:48:55,457 INFO spawned: 'tomcat' with pid 9
2014-10-06 19:48:56,503 INFO success: tomcat entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

sigterm を受信して​​正常に終了する以前のログとは対照的です。

2014-10-06 20:02:59,527 CRIT Supervisor running as root (no user in config file)
2014-10-06 20:02:59,556 INFO RPC interface 'supervisor' initialized
2014-10-06 20:02:59,556 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2014-10-06 20:02:59,557 INFO supervisord started with pid 1
2014-10-06 20:03:00,561 INFO spawned: 'tomcat' with pid 9
2014-10-06 20:03:01,602 INFO success: tomcat entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2014-10-06 20:05:11,690 WARN received SIGTERM indicating exit request
2014-10-06 20:05:11,690 INFO waiting for tomcat to die
2014-10-06 20:05:12,450 INFO stopped: tomcat (exit status 143)

どんな助けでも感謝します。

ありがとう、カーシック

更新

Supervisord.conf ファイル

[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log

[program:mysql]
command=/usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/bin/mysqld_safe --pid-file=/var/run/mysqld/mysqld.pid
stdout_logfile=/tmp/mysql.log
stderr_logfile=/tmp/mysql_err.log

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
4

1 に答える 1

3

run.sh を介してプロセスを実行すると、シグナルはそのプロセスにのみ送信されます。あなたがそうでない限り

  1. トラップなどを使用して、子プロセスにシグナルを送信するために邪魔をする
  2. プロセスグループにシグナルを送信します。
  3. exec supervisord ...run.sh で行う

子プロセスはシグナルを受け取りません。

于 2014-10-06T20:09:41.860 に答える