繁体   English   中英

如何使用Minikube在盒中捕捉SIGTERM

[英]How to catch SIGTERM in a pod with Minikube

我正在使用有史以来最简单的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。

我尝试删除吊舱/部署或上下缩放。 在任何情况下,在删除之前都不会获得SIGTERM。 它尊重terminationGracePeriodSeconds但在杀死Pod之前似乎没有运行preStop命令或发送SIGTERM。

那是由于使用minikube吗? 还是我做错了其他事?

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

阅读CMD上的Dockerfile文档

CMD指令具有三种形式:

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

如果您使用CMD的shell形式,则将在/ 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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM