что это на самом деле означает, когда docker-compose говорит, что он «изящно останавливается»?
В основном, когда вы нажимаете Ctrl + C, вы посылаете сигнал SIGINT (2) наприложение, которое работает на переднем плане.В большинстве случаев семантика этого сигнала аналогична сигналу SIGTERM (15), который генерируется при выполнении docker-compose stop
или, в основном, docker stop
, если вы работаете с приложением из одного контейнера.
Docker-compose пытается выполнить какой-нибудь протокол завершения работы, а затем убивает мой контейнер только после истечения времени ожидания?
Да, идея заключается в том, что работающее приложение может перехватить сигналы SIGINT и SIGTERM и выполнить некоторую очисткуоперация перед выходом.
Напротив, сигнал SIGKILL (9) (например, docker kill
) вызывает немедленное завершение процесса.
Вас может заинтересовать этот связанный SO ответ где я привожу игрушечный пример bash-скрипта точки входа, который «ловит» сигналы SIGINT и SIGTERM (но, конечно, не SIGKILL).
Могу ли я что-нибудь сделать дляускорить отключение контейнера при уничтожении с помощью ctrl + c в docker-compose up?
Я бы сказал, что время, потраченное вашими контейнерами на выход, когдаВы docker stop
или так сильно зависит от реализации соответствующих изображений.
На первый взгляд, вы можете изменить (например, сократить) время, предлагаемое контейнерам для изящной остановки:
, но это, конечно, не будетправильное решение.
На самом деле, есть два типичных ловушек , когда каждый полагается на сценарий входа bash :
Используйте скрипт bash в качестве оболочки для окончательного вызова другой программы, но не забудьте использовать встроенный exec
.
→ Рекомендуемая практика заключается в добавлении последней команды точки входа bash с помощью exec
(например, см. эта строка из entrypointd.sh
в sudo-bmitch/docker-base
).
Когда сам скрипт bash не должен завершаться немедленно, можно забыть позаботиться о перехвате сигналов(включая SIGINT и SIGTERM) и вести себя соответственно, что также может бытьАуза вопроса, который вы наблюдаете.Это связано с так называемой PID 1 проблемой зомби .
→ Чтобы обойти это, вы можете запустить свой образ с флагом docker run
--init
или добавьте параметр docker-compose.yml
init
(связанный с SO Q.)