我有一个脚本,我用它来帮助我从here获得的名为wait_to_start.sh
的docker-compose编排:
#!/bin/bash
echo $WAIT_COMMAND
echo $WAIT_START_CMD
is_ready() {
eval "$WAIT_COMMAND"
}
# wait until is ready
i=0
while ! is_ready; do
i=`expr $i + 1`
if [ $i -ge $WAIT_LOOPS ]; then
echo "$(date) - still not ready, giving up"
exit 1
fi
echo "$(date) - waiting to be ready"
sleep $WAIT_SLEEP
done
#start the script
exec $WAIT_START_CMD
但是,我无法正常工作。我想使用netcat来测试服务是否正在运行。
couchbase:
container_name: couchbase
image: couchbase/server:community-3.0.1
volumes:
- /opt/couchbase/var:/opt/couchbase/var
ports:
- "8091:8091"
myapp:
container_name: myapp
image: myapp
command: wait_to_start.sh
volumes_from:
- couchbase
links:
- couchbase:couchbase
environment:
- WAIT_COMMAND=[ `nc -z -w3 localhost 8091` -eq 0 ]
- WAIT_START_CMD=mycmd
- WAIT_SLEEP=2
- WAIT_LOOPS=10
但它不起作用。
当我在命令行上直接运行netcat时,它可以工作。成功时返回0。以上都不起作用。
我得到了:
bash: [: =: unary operator expected
所以我玩了一遍,发现回显WAIT_COMMAND
会产生
[ -eq 0 ]
我做错了什么?我是一个bash noob。一定很简单。
答案 0 :(得分:1)
而不是
WAIT_COMMAND=[ nc -z -w3 localhost 8091 -eq 0 ]
只需使用
WAIT_COMMAND="nc -z -w3 localhost 8091"
评估程序的返回代码不需要[
命令。
答案 1 :(得分:1)
感谢提示和评论以及大量实验。 最终有效的是:
[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]
我还发现,如果我尝试直接在脚本中设置WAIT_COMMAND来测试它,它会尽早得到评估。所以我不得不使用单引号。
即
WAIT_COMMAND='[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]'
在docker-compose.yml中,它看起来像这样:
environment:
WAIT_COMMAND=[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]
或者简单地说:(谢谢Etan!)
WAIT_COMMAND="! nc -z -w3 couchbase 11211"