循环槽docker输出,直到我在bash中找到一个字符串

问题描述 投票:0回答:1

我对bash相当陌生(几乎没有任何经验,我需要一些bash脚本的帮助。

我正在使用docker-compose创建多个容器-在此示例中,假设2个容器。第二个容器将执行bash命令,但在此之前,我需要检查第一个容器是否可操作且已完全配置。我不想使用sleep命令,而是要创建一个bash脚本,该脚本将位于第二个容器中,并在执行后执行以下操作:

  1. 执行命令并将控制台输出记录在文件中
  2. 读取该文件,然后检查是否存在字符串。我将在上一步中执行的命令将花费几秒钟(5-10)秒来完成,并且在文件执行完后我需要读取文件。我想我可以添加睡眠以确保命令完成执行,或者有更好的方法来执行此操作?
  3. 如果字符串不存在,我想再次执行相同的命令,直到找到要查找的字符串
  4. 一旦找到要查找的字符串,我想退出循环并执行其他命令

我发现了如何在Java中执行此操作,但是如果需要在bash脚本中执行此操作。

Docker容器将alpine作为操作系统,但我更新了Dockerfile来安装bash。

我尝试了此解决方案,但它不起作用。

#!/bin/bash

[command to be executed] > allout.txt 2>&1

until 
  tail -n 0 -F /path/to/file | \
  while read LINE
  do
    if echo "$LINE" | grep -q $string
    then
      echo -e "$string found in the console output"
  fi
  done
do
    echo "String is not present. Executing command again"
    sleep 5
    [command to be executed] > allout.txt 2>&1
done

echo -e "String is found"
bash docker loops alpine console-output
1个回答
0
投票

docker-compose文件中,请使用depends_on选项。

depends_on将照顾您的多个容器的启动和关闭顺序。

但是在移动到另一个容器启动之前,它不会检查容器是否已准备就绪。要处理此情况,请检查this

link中所述,

  • 您可以使用诸如wait-for-itdockerize或与sh兼容的wait-for之类的工具。这些是小型包装脚本,您可以将其包含在应用程序的图像中,以轮询给定的主机和端口,直到它接受TCP连接为止。

OR

  • 或者,编写您自己的包装器脚本以执行更特定于应用程序的运行状况检查。

[如果您不想使用上述工具,请签出this。在这里,它们使用HEALTHCHECKservice_healthy条件的组合,如here所示。有关完整的示例,请检查this

© www.soinside.com 2019 - 2024. All rights reserved.