我有一个Docker
容器正在运行HBase
有关详细信息,请参阅here。基本上,HBase需要大约30秒才能活跃起来。
显然我有其他容器取决于这个。在其中一个中,docker-entrypoint.sh
我基本上是这样做的:
#!/bin/bash
/path/to/command argument
while [ $? -ne 0 ]; do
sleep 2;
/path/to/command argument
done
这里的问题是/path/to/command
是部署网络服务器的东西,它将与HBase
容器交互。如果成功,它会阻塞当前进程(这很好,因为它在容器中),但同样地,如果它失败,它会打印堆栈跟踪但不会退出一些-ne 0
代码(实际上,根本不退出)。事实上,如果退出--restart=always
将会处理它。
所以,我的问题是,如何在成功之前保持重试,基本上没有退出一些失败代码?退出Docker
容器也是一种选择,因此它可以继续重启直到成功。目前,我没有机会修改退出的代码以退出。
我必须这样做:
#!/bin/bash
tmp=$(mktemp)
/path/to/command args 2> "$tmp" &
while true; do
sleep 5;
if [ -s "$tmp" ]; then
exit
fi
done
基本上,我必须在后台运行它,以便上面的脚本继续执行(path/to/command
是一个UI阻塞命令 - 比如服务器的listen
- 当成功时不会退出-it听 - 当它失败时 - 它应该有,这就是为什么我问这个问题 - )。
因此,为了不让Docker容器退出,我必须添加一个while true;
循环,我在其中检查$tmp
中是否存在错误。如果有,我只需exit
。
我将bash脚本更改为:
#!/bin/bash
/path/to/command args &
while true; do
sleep 10;
response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost);
if [ "$response" != "200" ]; then
exit
fi
done
由于我的容器正在部署Web服务器,所以在启动它之后,我至少在主线程中监视它的状态。还有改进的余地。
答案 0 :(得分:2)
您可以尝试将stderr
重定向到某个文件,然后检查该文件是否为空:
tmp=$(mktemp)
/path/to/command argument 2> "$tmp"
# Run code until "$tmp" is empty
until [ -s "$tmp" ]; do
sleep 2
/path/to/command argument 2> "$tmp"
done
rm "$tmp"