在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_down
function就退出
如何捕获在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