Как поймать SIGTERM в капсуле с Миникубе - PullRequest
0 голосов
/ 19 мая 2018

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

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 перед тем, как убить модуль.

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

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

1 Ответ

0 голосов
/ 19 мая 2018

Чтение документации 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».

При создании файла Docker обязательно используйте форму exec.В противном случае приложение будет запущено как подкоманда / bin / sh -c, которая не передает сигналы.PID1 контейнера будет оболочкой, ваше приложение не получит никаких сигналов.

Попробуйте изменить свой файл Docker для использования формы exec

FROM ubuntu
COPY script.sh /script.sh
CMD ["/script.sh"]
...