Неужели Docker Stop пытается остановить процесс, запущенный внутри контейнера, правильным образом, в то время как Docker kill отправит сигнал kill?
По сути, да, разница невелика, но изложена в справочнике по командной строке :
- остановка docker : остановка работающего контейнера ( отправка SIGTERM, а затем SIGKILL по истечении льготного периода ) [...] Основной процесс внутри контейнера получит SIGTERM, а после льготного периода SIGKILL. [Акцент мой]
- docker kill : убить работающий контейнер ( отправить SIGKILL или указанный сигнал ) [...] Основному процессу внутри контейнера будет отправлен SIGKILL или любой сигнал, указанный с помощью опции --signal. [Акцент мой]
Таким образом, stop
попытка инициировать постепенное отключение путем отправки стандартного сигнала POSIX SIGTERM
, в то время как kill
просто убивает процесс по умолчанию (но также позволяет отправлять любой другой сигнал):
Сигнал SIGTERM отправляется процессу, чтобы запросить его завершение. В отличие от сигнала SIGKILL, он может быть пойман и интерпретирован или проигнорирован процессом. Это позволяет процессу выполнять правильное завершение, освобождая ресурсы и сохраняя состояние, если это необходимо. Следует отметить, что SIGINT практически идентичен SIGTERM.
Хотя процессы не выполняются в любом случае, как правило, ожидается, что процессы будут корректно обрабатываться SIGTERM
и делать правильные вещи в зависимости от их обязанностей - это может легко потерпеть неудачу из-за попытки постепенного завершения работы, которая длится дольше, чем льготный период, что следует учитывать, если целостность данных первостепенное значение (например, для баз данных); см., например, SIGTERM vs. SIGKILL майора Хейдена для более подробного объяснения:
Приложение может определить, что оно хочет сделать после получения SIGTERM. Хотя большинство приложений будут очищать свои ресурсы и останавливаться, некоторые могут этого не делать. Приложение может быть настроено на выполнение чего-то совершенно другого при получении SIGTERM. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.