Контейнер игнорирует SIGTERM и умирает по таймауту
Сервис описан так:
FROM node:20-slim
WORKDIR /app
COPY . .
CMD npm start
При каждом релизе часть запросов обрывается: остановка контейнера занимает ровно период ожидания (10 секунд), после чего процесс убивается принудительно. Обработчик SIGTERM в приложении написан и локально работает: сервис закрывает keep-alive соединения и завершается за 1-2 секунды.
Внутри работающего контейнера дерево процессов такое:
PID COMMAND
1 /bin/sh -c npm start
7 npm start
18 node /app/server.js
Что здесь происходит и как это чинить? Выберите все верные утверждения.
правильных вариантов может быть несколько
- Из-за shell-формы `CMD` процессом с PID 1 становится оболочка: сигнал приходит ей, а дочернему процессу приложения не пересылается
- Помогает exec-форма с прямым запуском процесса — `CMD ["node", "server.js"]`: тогда PID 1 становится само приложение и SIGTERM приходит именно ему
- Нужно увеличить период ожидания остановки флагом `--stop-timeout`: сервису просто не хватает стандартных 10 секунд, чтобы закрыть keep-alive соединения и корректно выйти
- Docker всегда отправляет SIGKILL сразу, обработчик SIGTERM в контейнере не вызывается в принципе
- Причина в базовом образе slim: в нём вырезана поддержка обработки сигналов
