Выбор ответа 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 и получает сигнал.
Варианты ответа
- Node не умеет обрабатывать сигналы внутри контейнера
- Alpine не поддерживает SIGTERM, и Docker сразу шлёт процессу SIGKILL
- Нужно увеличить таймаут
docker stopдо 30 секунд - 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 ошибок.