Как отправить сигнал на запуск программы в контейнере докеров?

У меня есть программа, запускаемая в контейнере докера с отключенным режимом.

Итак, как отправить сигнал, такой как 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/

Ответ 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:

  1. Получение идентификатора контейнера - docker ps | grep yourProgramName - для меня это выглядит так - 4b6425cf4261
  2. Войдите в контейнер, используя docker exec -it 4b6425cf4261 bash
  3. Перечислите все запущенные процессы с помощью ps -A
  4. Найдите PID процесса, на который вы хотите отправить SIGINT
  5. Отправьте ему сигнал: kill -SIGINT PID (пример: kill -SIGINT 15)

Ответ 5

Вы можете просто сделать:

docker kill --signal=<signal> <container>