从高山图像中捕获SIGTERM

问题描述 投票:2回答:1

[我试图从Docker实例捕获SIGTERM信号(基本上是在调用docker stop时,但是找不到方法,因为每次执行的尝试都会得到不同的结果。

以下是我的设置

Dockerfile

FROM gitlab/gitlab-runner:alpine

COPY ./start.sh /start.sh

ENTRYPOINT ["/start.sh"]

start.sh

#!/bin/bash

deregister_runner() {
    echo "even if nothing happened, something happened"
    exit
}
trap deregister_runner SIGTERM

while true; do
    sleep 10
done

现在我构建泊坞窗映像

$ docker build -t dockertrapcatch .
Sending build context to Docker daemon  51.71kB
Step 1/3 : FROM gitlab/gitlab-runner:alpine
 ---> 9f8c39873bee
Step 2/3 : COPY ./start.sh /start.sh
 ---> Using cache
 ---> ebb3cac0c509
Step 3/3 : ENTRYPOINT ["/start.sh"]
 ---> Using cache
 ---> 7ab67fe5a714
Successfully built 7ab67fe5a714
Successfully tagged dockertrapcatch:latest

运行泊坞窗

$ docker run -it dockertrapcatch

现在当我运行docker stop <<container_id_here>>docker kill --signal=SIGTERM <<container_id_here>>时,未调用我的deregister_runner函数。

此后,我如下更改了[[start.sh脚本(SIGKILL ==> EXIT)

#!/bin/bash deregister_runner() { echo "even if nothing happened, something happened" exit } trap deregister_runner EXIT while true; do sleep 10 done
在进行此更改并创建docker映像并运行它后,docker stop <<container_id_here>>仍然不起作用,但是docker kill --signal=SIGTERM <<container_id_here>>起作用!

$ docker run -it dockertrapcatch even if nothing happened, something happened

$ docker kill --signal=SIGTERM 6b667af4ac6c
6b667af4ac6c
我知道实际上docker stop发送了一个[[SIGTERM
,但是我认为这一次它不起作用?有什么主意吗?
docker dockerfile gitlab-ci-runner alpine sigkill
1个回答
1
投票
发生问题的原因不是alpine而是gitlab/gitlab-runner:alpine图像本身,即this Dockerfile包含以下行:

Dockerfile

[更确切地说,上面的行表示STOPSIGNAL SIGQUIT将向正在运行的容器发送docker stop信号(并在杀死容器之前等待“优美的终止时间”,就像在容器中发出了SIGQUIT。结束)。

如果未使用此Dockerfile指令,则为docker kill

请注意,由于无法捕获KILL信号,对于the default signal sent by docker stop is SIGTERMdocker stop的选择非常差。

因此,如果使用以下行,您的第一个示例应该可以工作:

SIGKILL

通过这种方式,您每次发出STOPSIGNAL或使用trap deregister_runner SIGINT SIGQUIT SIGTERM 键绑定(由于[C​​0])都会触发清理功能deregister_runner

最后,还有两个有关此docker stopCtrl-C和信号的问题的附加说明:

    可以自定义“优美的终止时间”(在停止和终止之间),使用Bash入口点时(关于“信号传播”)存在一些陷阱。我在这个SO答案中更详细地解释了两个问题:SIGINT
  • 请注意,在许多Docker图像中,尚未预装bash,例如:

  • Speed up docker-compose shutdown

    (很遗憾,alpine并非如此,它实际上包含bash包:)

© www.soinside.com 2019 - 2024. All rights reserved.