Как поймать SIGTERM в стручке с Minikube

Я использую самый простой докер:

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, но не могу заставить его перехватывать сигналы SIGTERM от kubernetes.

Я попытался удалить модуль/развертывание или масштабировать его вверх и вниз. Ни в коем случае он не получил SIGTERM перед удалением. Он уважает terminationGracePeriodSeconds, но, похоже, не запускает команду preStop и не отправляет SIGTERM перед уничтожением модуля.

Это из-за использования minikube? или я делаю что-то еще не так?

(развертывание не является частью службы, это просто развертывание) (SSH в модуль и вручную kill работает, как и ожидалось)


person Amir Mehler    schedule 19.05.2018    source источник


Ответы (1)


Чтение документации Dockerfile по CMD

Инструкция CMD имеет три формы:

  • CMD [исполняемый файл, param1, param2] (форма exec, это предпочтительная форма)
  • CMD [param1,param2] (как параметры по умолчанию для ENTRYPOINT)
  • Команда CMD param1 param2 (форма оболочки)

Если вы используете форму оболочки CMD, то она будет выполняться в /bin/sh -c

Итак, вы используете форму оболочки, что означает, что ваша команда /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"]
person Jose Armesto    schedule 19.05.2018
comment
Каждая крошечная деталь имеет огромное значение в Docker и Kubernetes. Спасибо. - person Amir Mehler; 20.05.2018