Я пытаюсь развернуть 3 контейнера Docker, между которыми существует отношение зависимости (A -> B -> C). Теперь каждый контейнер должен запускать экземпляр Akka-Spray поверх экземпляра JVM.
Проблема в следующем: при использовании обычных подходов к оркестровке контейнер A был запущен, но веб-сервер не успел загрузиться. Если он не будет запущен до того, как контейнер B заработает, контейнер B никогда не догонит его и так далее с C.
В последнее время я пробовал следующий подход: разделить объем данных между контейнерами; после того, как веб-сервер будет готов, вспомогательный скрипт создаст на томе пустой файл; запустить сценарий (через службу Upstart), который ищет пустой файл для отображения и запускает следующий контейнер.
Однако причиной этой проблемы, скорее всего, является использование службы:
sudo docker run -d -it --name=backend -v ~/docker-test/:/docker-test -v ~/aux/:/aux ubuntu /bin/bash -c "</path/to/test/script>"
отлично работает, если выполняется просто в командной строке, но случайно не работает в сценарии, выполняемом службой Upstart (получение сообщения "/bin/bash </path/to/test/script> : no such file or directory"
).
Кто-нибудь сталкивался с этим? Я с благодарностью приветствую любые предложения по преодолению этого.
Один из вариантов - просто подождать, пока откроется удаленный сетевой порт, что означает, что веб-сервер запущен. Код ниже основан на эта ветка на SuperUser
#!/bin/sh
SERVICE_IP=`sudo docker inspect -f \"{{.NetworkSettings.IPAddress}}\" $CONTAINER_NAME`
SERVICE_PORT=80
while ! nc -vz \$SERVICE_IP \$SERVICE_PORT; do sleep 1; done
Это можно комбинировать с оркестратором сборки контейнера (если этот оркестратор изначально не поддерживает ожидание, когда «порт контейнера запущен» - я не знаю, что доступно в этом направлении).
Почему бы не взглянуть на специальный оркестратор докеров, такой как flynn, deis, верфь и т. Д.?
Довольно список Вот