如何使用Minikube在

时间:2018-05-19 10:45:48

标签: bash kubernetes minikube termination

我正在使用最简单的码头工具:

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 - 按预期工作)

1 个答案:

答案 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"]