При остановке контейнера в Docker по умолчанию отводится 10 секунд на завершение процесса после отправки сигнала SIGTERM. Если процесс не успевает завершиться, Docker принудительно отправляет SIGKILL, что приводит к аварийному завершению с кодом 137 и возможной потере данных при незавершенных транзакциях.
Проблема часто возникает, когда скрипт запуска (entrypoint) делает оболочку shell процессом с PID 1. Поскольку shell не передает сигналы дочерним процессам, приложение не получает команду на остановку. Использование команды exec в скриптах или отказ от shell-формы в инструкциях CMD позволяет приложению стать PID 1 и корректно обрабатывать сигналы.
Даже если приложение является PID 1, Python по умолчанию игнорирует SIGTERM. Использование опции init: true в Docker Compose помогает передавать сигналы, но не гарантирует корректное завершение работы, так как процесс может закрыться до завершения записи в базу данных. Для решения проблемы рекомендуется программно обрабатывать сигналы и дожидаться завершения текущей задачи.
Для задач, требующих длительного времени выполнения, разработчикам следует настраивать параметр stop_grace_period в Docker Compose, увеличивая его сверх стандартных 10 секунд. Это позволяет избежать принудительного завершения процесса в середине выполнения критически важных операций, таких как запись данных в базу.






