Выбор ответа Middle Dockerfile и multi-stage спрашивают часто обновлено

Контейнер останавливается 10 секунд

Вопрос

docker stop api каждый раз ждёт 10 секунд, а в логах приложения нет сообщения о получении SIGTERM. В Dockerfile CMD node server.js. В чём причина?

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

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

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

Коротко

Правильный ответ: Shell-форма: PID 1 это /bin/sh -c, он не передаёт SIGTERM приложению. В shell-форме Docker запускает /bin/sh -c "node server.js", сигнал получает shell и (в большинстве реализаций, если он не заменил себя через exec) не пересылает его дальше.

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

  1. Shell-форма: PID 1 это /bin/sh -c, он не передаёт SIGTERM приложениюправильный ответ
  2. Node.js не обрабатывает сигналы без флага --signals, поэтому SIGTERM теряется
  3. Без EXPOSE Docker не может связаться с процессом и ждёт таймаут перед SIGKILL
  4. Таймаут 10 секунд задан в Node.js: он откладывает выход до закрытия всех соединений

Разбор

В shell-форме Docker запускает /bin/sh -c "node server.js", сигнал получает shell и (в большинстве реализаций, если он не заменил себя через exec) не пересылает его дальше. По истечении таймаута docker stop (10 секунд) приходит SIGKILL. Решение: exec-форма CMD ["node", "server.js"] и обработчик SIGTERM в приложении, или tini. Node умеет обрабатывать сигналы, EXPOSE к этому отношения не имеет.

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

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