Я пытаюсь решить известную проблему с порядком загрузки контейнеров в docker-compose, поэтому я остановился на простом решении, имея сценарий для проверки, готова ли среда к запуску команды.
В этом заключается идея, что для контейнера определена некоторая переменная среды:
- WAIT_COMMAND должен быть строкой, определяющей логический тест в сценарии sh, который должен возвращать логическое значение
- START_CMD строка с командой для запуска в зависимости от результата WAIT_COOMAND, в противном случае повторите попытку, пока не будет достигнут LOOPS.
- ПЕТЛИ, сколько раз пытаться
- СОН, сколько спать между попытками
В этом примере я жду ответа от elasticSearch перед запуском моего приложения, которое зависит от данных ES для загрузки.
Следующий скрипт будет моим ENTRYPOINT в контейнере докеров.
Экспортированные вары ENV
WAIT_COMMAND="$(curl --write-out %{http_code} --silent --output /dev/null http://elastic:9200/_cat/health?h=st) == 200"
LOOPS=3
START_CMD="python my_script_depending_on_elastic.py"
SLEEP=2
Имея указанные выше переменные ENV, скрипт должен дождаться, пока запрос ES не вернет код 200.
#!/bin/bash
is_ready() {
eval $WAIT_COMMAND
}
# wait until is ready
i=0
while ! is_ready; do
i=`expr $i + 1`
if [ $i -ge $LOOPS ]; then
echo "$(date) - still not ready, giving up"
exit 1
fi
echo "$(date) - waiting to be ready"
sleep $SLEEP
done
#start the script
exec $START_CMD
Проблема в том, что код не работает в строке функции is_ready, он не возвращает логическое значение, а пытается выполнить 200 как команду
# ./wait_elastic.sh
./wait_elastic.sh: line 9: 200: command not found
Fri Jul 3 18:26:43 UTC 2015 - waiting to be ready
./wait_elastic.sh: line 9: 200: command not found
Fri Jul 3 18:26:45 UTC 2015 - waiting to be ready
./wait_elastic.sh: line 9: 200: command not found
Fri Jul 3 18:26:47 UTC 2015 - still not ready, giving up
Как я могу провести тест, чтобы проверить, в порядке ли ответ curl?
Как указать логическую тестовую команду как:
WAIT_COMMAND="$(curl --write-out %{http_code} --silent --output /dev/null http://elastic:9200/_cat/health?h=st) == 200"
и как это оценить:
is_ready() {
eval $WAIT_COMMAND
}
?
i=$(( i + 1 ))
;if (( i >= LOOPS ))
; и т.д.$(( ))
присутствует в стандарте POSIX;(( ))
- это расширение bash / ksh / zsh. - person Charles Duffy   schedule 03.07.2015