如何使用 Minikube 在 pod 中捕获 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。
我尝试删除 pod/deployment 或将其放大或缩小。在任何情况下,它在被删除之前都不会收到 SIGTERM。它尊重 terminationGracePeriodSeconds
但似乎没有 运行 preStop
命令或在杀死 pod 之前发送 SIGTERM。
是因为使用了 minikube 吗?还是我做错了什么?
(部署不是服务的一部分,它只是一个部署)
(SSH 进入 pod 并手动 kill
-ing 它按预期工作)
阅读the Dockerfile documentation on CMD
The CMD instruction has three forms:
- CMD ["executable","param1","param2"] (exec form, this is the preferred form)
- CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
- CMD command param1 param2 (shell form)
If you use the shell form of the CMD, then the will execute in /bin/sh -c
所以你使用的是shell形式,也就是说你的命令是/bin/sh -c script.sh。然后,当 kubernetes 向容器发送 SIGTERM 时,接收信号的不是 script.sh 进程,而是 /bin/sh 进程。这就是为什么您看不到“收到 SIGTERM”消息的原因。
创建 Dockerfile 时,请确保使用 exec 形式。否则应用程序将作为 /bin/sh -c 的子命令启动,不传递信号。容器的 PID1 将是 shell,您的应用程序将不会收到任何信号。
尝试更改您的 Dockerfile 以使用 exec 形式
FROM ubuntu
COPY script.sh /script.sh
CMD ["/script.sh"]
我使用的是有史以来最简单的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/deployment 或将其放大或缩小。在任何情况下,它在被删除之前都不会收到 SIGTERM。它尊重 terminationGracePeriodSeconds
但似乎没有 运行 preStop
命令或在杀死 pod 之前发送 SIGTERM。
是因为使用了 minikube 吗?还是我做错了什么?
(部署不是服务的一部分,它只是一个部署)
(SSH 进入 pod 并手动 kill
-ing 它按预期工作)
阅读the Dockerfile documentation on CMD
The CMD instruction has three forms:
- CMD ["executable","param1","param2"] (exec form, this is the preferred form)
- CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
- CMD command param1 param2 (shell form)
If you use the shell form of the CMD, then the will execute in /bin/sh -c
所以你使用的是shell形式,也就是说你的命令是/bin/sh -c script.sh。然后,当 kubernetes 向容器发送 SIGTERM 时,接收信号的不是 script.sh 进程,而是 /bin/sh 进程。这就是为什么您看不到“收到 SIGTERM”消息的原因。
创建 Dockerfile 时,请确保使用 exec 形式。否则应用程序将作为 /bin/sh -c 的子命令启动,不传递信号。容器的 PID1 将是 shell,您的应用程序将不会收到任何信号。
尝试更改您的 Dockerfile 以使用 exec 形式
FROM ubuntu
COPY script.sh /script.sh
CMD ["/script.sh"]