在bash中捕获来自"docker stop"的信号

ben*_*rtz 16 bash docker

我在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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何通过docker stop在容器上运行来捕获发送的信号.以交互方式运行时,a ctrl+c将按预期触发它,但docker stop命令只等待10秒超时,并在不进入shut_down函数的情况下退出

如何捕获docker stopbash 发送的信号进行一些清理?

小智 12

老问题,但这将做的伎俩:

#!/bin/bash

echo starting up

exec /opt/myapp
Run Code Online (Sandbox Code Playgroud)

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


BBJ*_*BJ3 9

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

更新:

@ 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"
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,`/ opt/myapp`在forground中运行并阻止陷阱执行.解决方案是将该行更新为:`/ opt/webapp&; wait` (8认同)
  • @ Nick-Humrich是的,...这是我几乎停止使用stackoverflow服务的原因之一,经过超过5年的会员资格,......太多的限制,权限,无用的任意审核(等等:-) (3认同)

Max*_*ime 5

从 Docker 1.9 开始,您可以使用STOPSIGNAL以下指令Dockerfile

\n\n
\n
STOPSIGNAL signal\n
Run Code Online (Sandbox Code Playgroud)\n\n

设置STOPSIGNAL将发送到容器以退出的系统调用信号。该信号可以是与 kernel\xe2\x80\x99s 系统调用表中的位置匹配的有效无符号数字(例如 9),也可以是 SIGNAME 格式的信号名称(例如 SIGKILL)。

\n
\n\n

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

\n

  • 请注意,在您可以使用的所有信号中,信号 9 可能是最差的。之所以称为 KILL,是因为它会杀死目标进程而不给其清理的机会。例如,在配置不当的数据库服务器上使用它可能会造成灾难性的后果。 (6认同)