Выбор ответа Middle Docker для разработчика обновлено

Shell-форма CMD и SIGTERM

Вопрос

Сервис с CMD node server.js при docker stop всегда останавливается ровно через 10 секунд, и graceful shutdown не срабатывает. В чём вероятная причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Shell-форма: PID 1 это /bin/sh, он не передаёт SIGTERM в Node. В exec-форме CMD ["node", "server.js"] Node сам становится PID 1 и получает сигнал.

Варианты ответа

  1. Node не умеет обрабатывать сигналы внутри контейнера
  2. Alpine не поддерживает SIGTERM, и Docker сразу шлёт процессу SIGKILL
  3. Нужно увеличить таймаут docker stop до 30 секунд
  4. Shell-форма: PID 1 это /bin/sh, он не передаёт SIGTERM в Nodeправильный ответ

Разбор

В exec-форме CMD ["node", "server.js"] Node сам становится PID 1 и получает сигнал. В shell-форме сигнал получает оболочка. Исправление: exec-форма, а при необходимости init-процесс (docker run --init или tini).

  • Node обрабатывает сигналы через process.on("SIGTERM").
  • Больший таймаут лишь продлит ожидание, сигнал всё равно не дойдёт.
  • SIGTERM это сигнал ядра Linux, дистрибутив ни при чём.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.