我正在使用最简单的码头工具:
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
但似乎没有运行preStop
命令或在杀死pod之前发送SIGTERM。
这是由于使用迷你管吗?或者我做错了什么?
(部署不是服务的一部分,只是部署)
(SSH进入pod并手动kill
- 按预期工作)
答案 0 :(得分:3)
阅读the Dockerfile documentation on CMD
CMD指令有三种形式:
- CMD ["可执行文件"," param1"," param2"](执行形式,这是首选形式)
- CMD [" param1"," param2"](作为ENTRYPOINT的默认参数)
- CMD命令param1 param2(shell form)
如果您使用CMD的shell形式,则将在/ 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"]