Ускорьте завершение работы с докером - PullRequest
0 голосов
/ 25 мая 2018

Когда я настраиваю свое приложение для запуска через docker-compose up, требуется несколько секунд, чтобы остановиться на Ctrl + C.Однако, если я запускаю docker kill ..., контейнер останавливается очень быстро.Есть ли что-нибудь, что я могу сделать, чтобы ускорить отключение контейнера при уничтожении с помощью ctrl + c в docker-compose up?

В частности, что это означает на самом деле, когда docker-compose говорит, что он «изящно останавливается»?Docker-compose пробует какой-то протокол завершения работы и затем убивает мой контейнер только после истечения времени ожидания?

1 Ответ

0 голосов
/ 25 мая 2018

что это на самом деле означает, когда 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 :

  1. Используйте скрипт bash в качестве оболочки для окончательного вызова другой программы, но не забудьте использовать встроенный exec.
    → Рекомендуемая практика заключается в добавлении последней команды точки входа bash с помощью exec (например, см. эта строка из entrypointd.sh в sudo-bmitch/docker-base).

  2. Когда сам скрипт bash не должен завершаться немедленно, можно забыть позаботиться о перехвате сигналов(включая SIGINT и SIGTERM) и вести себя соответственно, что также может бытьАуза вопроса, который вы наблюдаете.Это связано с так называемой PID 1 проблемой зомби .
    → Чтобы обойти это, вы можете запустить свой образ с флагом docker run --initили добавьте параметр docker-compose.yml init (связанный с SO Q.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...