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