Как отправить сигнал на запуск программы в контейнере докеров?
У меня есть программа, запускаемая в контейнере докера с отключенным режимом.
Итак, как отправить сигнал, такой как SIGINT, в эту программу?
Ответы
Ответ 1
Вы можете использовать nsenter для доступа в пространство контейнера и отправки вашего сигнала.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>
Дополнительная информация: http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/
Ответ 2
Вы можете использовать docker kill --signal="<signal>" <container name or id>
чтобы отправить любой сигнал корневому процессу данного контейнера.
См. Https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container.
Ответ 3
-
docker kill
используется для отправки сигнала в основной процесс контейнера, то есть с помощью PID 1.
- Любое приложение с PID 1 может обрабатывать сигналы напрямую. Ниже команды уничтожить основной процесс докера:
$ docker kill --signal="SIGTERM" container-id/name
- Но приложение, которое не имеет приложения PID 1, является фоновым процессом:
- Мы не можем отправлять сингл непосредственно в любой фоновый процесс, запущенный в контейнере докеров.
- В этом случае нам нужно уловить и обработать определяемый пользователем сигнал в оболочке script, запущенной как точка входа.
- Пусть мы имеем следующее
Dockerfile
. (Обновите его в соответствии с приложением)
FROM centos:6.7
# Install/Deploye the service below.
# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
-
Ниже entrypoint.sh
. (Обновите его в соответствии с приложением). Предположим, мы хотим перезапустить службу init.d
.
#start the service
/etc/init.d/<servicename> start
pid="$!"
# SIGUSR1- Single handler
my_handler() {
/etc/init.d/<servicename> restart
}
# Trap and handle the user defind singnal.
trap 'my_handler' SIGUSR1
# wait forever(Alive container.)
while true
do
tail -f /dev/null & wait ${!}
done
- Создайте изображение докеры и запустите контейнер.
- Теперь вы можете перезапустить службу с главного компьютера:
$docker kill --signal="SIGUSR1" container-id/name
Ответ 4
Мне удалось отправить сигнал, который я хочу, процессу (программе) в контейнере Docker:
- Получение идентификатора контейнера - docker ps | grep yourProgramName - для меня это выглядит так - 4b6425cf4261
- Войдите в контейнер, используя docker exec -it 4b6425cf4261 bash
- Перечислите все запущенные процессы с помощью ps -A
- Найдите PID процесса, на который вы хотите отправить SIGINT
- Отправьте ему сигнал: kill -SIGINT PID (пример: kill -SIGINT 15)
Ответ 5
Вы можете просто сделать:
docker kill --signal=<signal> <container>