2016-09-16 3 views
0

Я пытаюсь дождаться, когда мой контейнер-докер будет запускать некоторые команды.Почему это пока условие не сломается

я делаю следующее:

#!/bin/bash 

DOCKER_IP=192.168.99.100 
ES_PORT=9300 

docker-compose up -d 
while [ -z "$(nc -z $DOCKER_IP $ES_PORT)" ]; do 
    sleep 1 
done 
echo "Do some stuff now it's up !" 

Я уже проверить с cat -e возвращение nc -z пусто, без кавычек, с [ ! -n $(nc ...)] как условным выражением ...

Когда возвращение nc не пусто, у меня есть Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded! в цикле, и он никогда не выходит.

Почему это простое условие цикла не работает?

ответ

1

Проблема, скорее всего, связана с тем, что nc выводит сообщение «Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded!» на стандартную ошибку, а не на стандартный вывод (в противном случае вы не должны ее видеть). Вы можете перенаправить стандартную ошибку (так, чтобы он захватил с помощью подстановки команды) следующим образом:

while [ -z "$(nc -z $DOCKER_IP $ES_PORT 2>&1)" ]; do 
    sleep 1 
done 

Однако не все версии nc печати такого сообщения, когда соединение успешно (не мой). Итак, почему бы вам просто не использовать статус выхода nc -z:

while ! nc -z $DOCKER_IP $ES_PORT 
do 
    sleep 1 
done