LINUX.ORG.RU
решено ФорумAdmin

Как приложение в контейнере завершает работу?

 ,


0

4

Изучая Docker и Kubernetes возник вопрос. Ну вот представим, есть некий контейнер (например субд), который работает с файлами за пределами контейнера, которые будут нужны в целостном состоянии после завершения работы контейнера. Наступит момент, когда контейнер нужно будет закрыть, при этом мы не знаем, что в этот момент контейнер делает, может проводит какие-то операции записи в БД. Правильно будет корректно закрыть приложение в контейнере и после этого потушить сам контейнер. Не правильно будет прибить его принудительно.

Вопрос, где и как прописывается, как будет остановлено приложение в контейнере? Я не нашел никаких упоминаний об этом, ни в Dockerfile нигде.

Ответ на: комментарий от dada

Я правильно понял, что когда контейнер закрывается, то приложению посылается сигнал(?) закрыться, дальше, если оно в течение –time периода не закроется, то оно убивается?

А все приложения нормально обрабатывают сигнал закрыться? Я видел некоторые сервисы, которым нужна спец консольная команда, чтобы они закрылись.

samson_b
() автор топика
Ответ на: комментарий от samson_b

Вам привели ссылку

The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL.
Если какому-то процессу надо что-то ещё, какой-то другой сигнал послать, то это проблема будет аналогичной и для живой системы. Если по SIGTERM не умерли по прошествии таймаута, то убьем по SIGKILL. В чем разница?
Вот смотрите есть у вас десктоп, отправляем в ребут, все получают SIGTERM, не сложилось, что же киляем SIGKILL. Ничего нового.
Даже шинда, и там счетчик на экране высвечивает, «прибью через...»

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 2)
Ответ на: комментарий от anc

Если какому-то процессу надо что-то ещё, какой-то другой сигнал послать, то это проблема будет аналогичной и для живой системы.

Для живой системы, если приложение сервис, может быть прописана конкретная команда для его завершения. Например так: *.service

ExecStop=/usr/bin/lncli --lnddir=/var/lib/lnd stop

samson_b
() автор топика
Ответ на: комментарий от samson_b

Хорошо, если она не умрет при shutdown что будет? Будем висеть «до посинения» или все-таки прибьем её ?

anc ★★★★★
()
Ответ на: комментарий от anc

Хорошо, если она не умрет при shutdown что будет? Будем висеть «до посинения» или все-таки прибьем её ?

Конечно прибьем. Вопрос был не в этом, вопрос был в:

А все приложения нормально обрабатывают сигнал закрыться?

Второй вопрос возник, можно ли как-то задать кастомную команду на закрытие приложения? Или все только через SIGTERM?

samson_b
() автор топика
Ответ на: комментарий от samson_b

Ты сам должен заботиться о том, чтобы твои приложения нормально завершались в соответствии с POSIX или еще как, например, соответствующим юнитом для сустемд.

mandala ★★★★★
()
Ответ на: комментарий от samson_b

Ещё раз

The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL.
Можете хоть на баше скрипт запуска написать, который при получении SIGTERM последовательно убьет все в нужной вам последовательности, но до исхода таймаута. Если кто-то не умер «мы не виноваты». :)

anc ★★★★★
()
Ответ на: комментарий от samson_b

А все приложения нормально обрабатывают сигнал закрыться?

Это не зависит от окружения. На хостовой ОС приложения закрываются точно также, никакой разницы с контейнером нет.

filosofia
()
Ответ на: комментарий от mandala

Понапихают сустимд в докер, позапускают там кучу процессов, а потом ноют, что докер говно, в lxc лудше работает.

filosofia
()
Ответ на: комментарий от filosofia

Это не зависит от окружения. На хостовой ОС приложения закрываются точно также,

это смотря как настроено в инит-скриптах

teod0r ★★★★★
()
Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от mandala

на системдэ пора ман писать в стиле «в системдэ нет….», короче выйдет.

olelookoe ★★★
()
Ответ на: комментарий от Einstok_Fair

Странно, что мне никто об этом не сказал. В Kubernetes есть такая штука, как preStop hook

https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hoo...

Это позволяет задать команду или скрипт, который поможет закрыть приложение, которое не откликается на SIGTERM

samson_b
() автор топика
Ответ на: комментарий от anc

Даже шинда, и там счетчик на экране высвечивает,

прям как systemd. Только systemd вместо адекватных 10-30 секунд предлагает подождать полторы минуты

SR_team ★★★★★
()
Ответ на: комментарий от te111011010

Почему нет?

# pct exec 102 ls /proc/1/exe -- -l
lrwxrwxrwx 1 root root 0 Nov 25 10:14 /proc/1/exe -> /lib/systemd/systemd
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.