如果默认的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运行进程时,信号只被发送到那个进程。 除非你是

  1. 用你的方式发送信号给subprocess,比如用陷阱
  2. 发送信号给进程组。
  3. exec supervisord ...在run.sh中

孩子的过程不会得到信号。

Interesting Posts