Используя Azure IoT Edge, я не нашел способа гарантировать порядок инициализации контейнеров / модулей в развертывании.Предположим, например, что у меня есть 2 модуля, A и B. A - это сервер, а B - это клиент, который зависит от A. Насколько я знаю, нет способа гарантировать, что A запускается раньше, чем B.
Шаблоны развертывания Azure IoT Edge соответствуют API-интерфейсу Docker Engine, и я не смог найти какой-либо способ применения зависимостей через этот API-интерфейс.В качестве обходного пути я не делаю предположений о том, какие контейнеры выполняются в коде каждого контейнера.Это работает, хотя накладные расходы на дополнительный код не идеальны, особенно если учесть, что такой инструмент, как docker-compose, сделал бы принудительный порядок инициализации довольно тривиальным.
Я хочу сделать что-то вроде этого (src: https://docs.docker.com/compose/compose-file/):
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
В качестве обходного пути и следуя приведенному выше примеру, в контейнере web
я выполнял следующие действия, чтобы убедиться, что postgres
запущен и работает до того, как web
выполняет postgres
зависимуюдействия:
postgresIsUp = False
while not postgresIsUp:
try:
pingPostgres()
postgresIsUp = True
except PingError:
print("postgres is not yet running")
Это, конечно, надуманный пример с явными недостатками, но он демонстрирует суть обходного пути.