如果默认的CMD是一个shell脚本,Docker停止退出代码-1
我正在用supervisord在Docker中构build一个tomcat容器。 如果Dockerfile中的默认命令是
CMD supervisord -c /etc/supervisord.conf
当我调度docker停止命令,容器退出码0成功退出。
但是,如果我有
CMD ["/run"]
并在run.sh中,
supervisord -c /etc/supervisord.conf
docker停止命令给我一个退出码-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)
任何帮助赞赏。
谢谢,Karthik
更新 :
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
当你通过run.sh运行进程时,信号只被发送到那个进程。 除非你是
- 用你的方式发送信号给subprocess,比如用陷阱
- 发送信号给进程组。
- 做
exec supervisord ...
在run.sh中
孩子的过程不会得到信号。