在bash中从“docker stop”捕获信号

我有一个docker容器中的入口点脚本,如下所示:

#!/bin/bash echo starting up function shut_down() { echo shutting down pid=$(ps -e | grep myapp | awk '{print $1}') kill -SIGTERM $pid exit } trap "shut_down" SIGKILL SIGTERM SIGHUP SIGINT EXIT /opt/myapp 

我无法弄清楚如何通过在容器上运行docker stop来发送信号。 当以交互方式运行时, ctrl+c将按预期触发,但是docker stop命令仅等待10秒超时,并且不用进入shut_downfunction就退出

如何捕获在bash中的docker stop发出的信号做一些清理?

看看这个 ,可能是鼓舞人心的:-)

更新:

@ nick-humrich这里是我的lamer复制和过去(功劳归原作者https://github.com/lgierth

 #!/bin/bash function ensure_started_container { exists=`docker ps -q | grep $1` if [ "$?" = "0" ] ; then echo "[docker-exec] skipping docker start, already started" else output=`docker start "$1"` echo "[docker start] $output" fi running=1 } function setup_signals { cid="$1"; shift handler="$1"; shift for sig; do trap "$handler '$cid' '$sig'" "$sig" done } function handle_signal { echo "[docker-exec] received $2" case "$2" in SIGINT) output=`docker stop -t 5 "$1"` echo "[docker stop] $output" running=0 ;; SIGTERM) output=`docker stop -t 5 "$1"` echo "[docker stop] $output" running=0 ;; SIGHUP) output=`docker restart -t 5 "$1"` echo "[docker restart] $output" # restart logging docker attach "$1" & kill "$logger_pid" 2> /dev/null logger_pid="$!" ;; esac } running=0 setup_signals "$1" "handle_signal" SIGINT SIGTERM SIGHUP ensure_started_container "$1" docker attach "$1" & logger_pid="$!" while true; do if [ "$running" = "1" ]; then sleep 1 else break fi done exit_code=`docker wait "$1"` exit "$exit_code" 

老问题,但这将做伎俩:

 #!/bin/bash echo starting up exec /opt/myapp 

详情请看这里: http : //www.techbar.me/stopping-docker-containers-gracefully/

从Docker 1.9开始,您可以在STOPSIGNAL中使用STOPSIGNAL指令:

 STOPSIGNAL signal 

STOPSIGNAL设置将被发送到容器的系统呼叫信号以退出。 这个信号可以是一个有效的无符号数字,与内核的syscall表中的一个位置相匹配,例如9,或者SIGNAME格式的信号名称,例如SIGKILL。

来源: https : //docs.docker.com/engine/reference/builder/#stopsignal