gpt4 book ai didi

docker - 从 Alpine 图像中捕获 SIGTERM

转载 作者:行者123 更新时间:2023-12-01 14:37:50 25 4
gpt4 key购买 nike

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

以下是我的设置

Dockerfile

FROM gitlab/gitlab-runner:alpine

COPY ./start.sh /start.sh

ENTRYPOINT ["/start.sh"]

开始.sh

#!/bin/bash

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

while true; do
sleep 10
done

现在我构建了 docker 镜像
$ 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

$ docker run -it dockertrapcatch

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

之后我更改了 开始.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 但我认为这一次它不起作用?任何的想法?

最佳答案

我可以重现您提出的问题,但当我用 debian:10 替换基本镜像时它不会出现, 例如。

碰巧问题不是由于 alpine但是到gitlab/gitlab-runner:alpine图片本身,即this Dockerfile 包含以下行:

STOPSIGNAL SIGQUIT



更准确地说,上面的行表示 docker stop将发送 SIGQUIT向正在运行的容器发出信号(并在终止容器之前等待“正常终止时间”,就好像最后发出了 docker kill)。

如果不使用这个 Dockerfile 指令, the default signal sent by docker stop is SIGTERM .

请注意 SIGKILL对于 STOPSIGNAL 来说,这将是一个非常糟糕的选择,假设 KILL 信号不能被捕获。

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

这样,您的清理功能 deregister_runner将在您发出 docker stop 时触发,或使用 Ctrl-C键绑定(bind)(感谢 SIGINT )。

最后,与 Docker 的这个问题相关的两个附加说明, bash和信号:
  • 可以自定义“优雅终止时间”(在停止和终止之间),并且在使用 Bash 入口点时存在一些陷阱(关于“信号传播”)。我在这个 SO 答案中更详细地解释了这两个问题:Speed up docker-compose shutdown .
  • 请注意,在许多 alpine图片,bash未预装,例如:
    $ sudo docker run --rm -it alpine /bin/bash
    /usr/bin/docker: Error response from daemon: OCI runtime create failed:
    container_linux.go:346: starting container process caused
    "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown.

    (幸运的是,gitlab/gitlab-runner:alpine 的情况并非如此,它确实包含 bash 包 :)
  • 关于docker - 从 Alpine 图像中捕获 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521712/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com