要求在一个大的while循环内,给定特定的docker容器ID,我需要使用docker event命令监视docker stop事件。找到事件后,我需要退出读取的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 session 中,我将运行此脚本,在另一个bash session 中,我将键入以下命令:
docker容器停止cassandra-1

问题是当我执行此bash程序时,我可以捕获stop事件并打印事件,但是此命令将重复读取事件。如何退出Docker事件并打印“此处获得”?

我花了大量时间在网上搜索解决方案,但找不到任何好的方法。我曾经考虑使用break,但是它不起作用,我也考虑过kill -9 $$,但是我将退出整个脚本程序。但是我只需要退出docker事件,而不是大while循环。

有什么好的建议吗?非常感谢!

最佳答案

我找到了解决方案。关键是要了解docker event命令的实际工作方式。根据我的研究,docker事件将生成一个进程,并停留在前台进程中。您应按CTRL + C退出(请参阅:https://docs.docker.com/engine/reference/commandline/events)。因此,您不能使用break来摆脱它。方法是在后台作业中执行docker event命令,并在发现事件时将其杀死。

代码如下:

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

关于bash - 阅读docker事件时,如何退出docker事件而不是整个程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53453967/

10-12 12:35