Назад | Перейти на главную страницу

Запускать контейнер Docker только после того, как процесс в другом контейнере заработает.

Я пытаюсь развернуть 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, верфь и т. Д.?

Довольно список Вот