[英]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指令具有三种形式:
- 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.