【问题标题】:How to catch SIGTERM in a pod with Minikube如何使用 Minikube 在 pod 中捕获 SIGTERM
【发布时间】:2018-10-29 16:03:21
【问题描述】:

我正在使用最简单的 docker:

FROM ubuntu
COPY script.sh /script.sh
CMD /script.sh

所有脚本的作用是:

#!/bin/bash

function sigterm() {
    echo "Got SIGTERM"
    exit
}

trap sigterm SIGTERM

i=1
while true; do
    echo "$(date +%H:%M:%S) | $((i++)) | $HOSTNAME"
    sleep 1
done

我在 Minikube 中运行这个容器,但我无法让它从 kubernetes 中捕获任何 SIGTERM。

我尝试删除 pod/部署或对其进行放大和缩小。在任何情况下,它在被删除之前都没有得到 SIGTERM。它尊重terminationGracePeriodSeconds 但似乎没有运行preStop 命令或在杀死pod之前发送SIGTERM。

是因为使用了 minikube 吗?还是我做错了什么?

(部署不是服务的一部分,它只是一个部署) (SSH 进入 pod 并手动 kill-ing 它按预期工作)

【问题讨论】:

    标签: bash kubernetes minikube termination


    【解决方案1】:

    阅读the Dockerfile documentation on CMD

    CMD指令有三种形式:

    • CMD ["executable","param1","param2"](执行形式,这是首选形式)
    • CMD ["param1","param2"](作为 ENTRYPOINT 的默认参数)
    • CMD 命令 param1 param2(shell 形式)

    如果你使用 shell 形式的 CMD,那么将在 /bin/sh -c 中执行

    所以你使用的是shell形式,这意味着你的命令是/bin/sh -c script.sh。那么,当 kubernetes 向容器发送 SIGTERM 时,接收信号的不是 script.sh 进程,而是 /bin/sh 进程。这就是您看不到“Got SIGTERM”消息的原因。

    创建 Dockerfile 时,请确保使用 exec 形式。否则应用程序将作为 /bin/sh -c 的子命令启动,它不会传递信号。容器的 PID1 将是外壳,您的应用将不会收到任何信号。

    尝试更改您的 Dockerfile 以使用 exec 表单

    FROM ubuntu
    COPY script.sh /script.sh
    CMD ["/script.sh"]
    

    【讨论】:

    • 每一个微小的细节都会对 Docker 和 Kubernetes 产生如此大的影响。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2019-11-05
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多