Выбор ответа 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) не пересылает его дальше.
Варианты ответа
- Shell-форма: PID 1 это
/bin/sh -c, он не передаёт SIGTERM приложениюправильный ответ - Node.js не обрабатывает сигналы без флага
--signals, поэтому SIGTERM теряется - Без
EXPOSEDocker не может связаться с процессом и ждёт таймаут перед SIGKILL - Таймаут 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 ошибок.