при чтении событий докера, как выйти из событий докера вместо всей программы? - PullRequest
0 голосов
/ 24 ноября 2018

Требование находится в большом цикле while, учитывая конкретный идентификатор контейнера докера, мне нужно отслеживать событие остановки докера с помощью команды события docker.Когда я обнаружил событие, мне нужно выйти из чтения события докера.

Упрощенный сценарий bash, который я написал, выглядит следующим образом:

#! /bin/bash

while true
do 
    ## other logics
    docker events --filter='container=...'  --filter='event=stop' | while read event
        do 
              echo $event
              break
        done      
     echo "got here"
     ## other logics
done

Таким образом, в одном сеансе bash я запускаю этот сценарий, в другом сеансе bash я набираю следующую команду: dockerостановка контейнера cassandra-1

Проблема заключается в том, что когда я выполняю эту программу bash, я могу записать событие остановки и распечатать событие, но эта команда прочитает событие, которое повторяется.Как выйти из докера событий и вывести «попал сюда»?

Я потратил много времени на поиск решения в Интернете, но не могу найти хорошего подхода.Однажды я подумал об использовании break, но это не сработало, и я также подумал, что kill -9 $$, но я закрою всю программу сценария.Но мне нужно только выйти из события docker вместо большого цикла while.

есть полезные советы?Большое спасибо!

1 Ответ

0 голосов
/ 24 ноября 2018

Я нашел решение.Ключевым моментом является знать, как на самом деле работает команда события docker.Основываясь на моих исследованиях, событие Docker генерирует процесс и застревает на переднем плане.Чтобы выйти, нажмите CTRL + C (см .: https://docs.docker.com/engine/reference/commandline/events).. Таким образом, вы не можете использовать команду break, чтобы выйти из нее. Подход состоит в том, чтобы выполнить команду события docker в фоновом режиме и уничтожить ее, когда я обнаружил событие.

код выглядит следующим образом:

  (docker events --filter 'container='"$container_id"'' --filter 'event=stop' &) | while read event
   do 
     # kill this backgroud process 
     pkill -f "docker event.*stop"
   done
...