有没有办法强制执行模块间的依赖关系/初始化顺序?



使用 Azure IoT Edge,我没有找到任何方法来保证部署中容器/模块的初始化顺序。例如,假设我有 2 个模块,A 和 B。A 是服务器,B 是依赖于 A 的客户端。据我所知,没有办法保证A在B之前启动。

Azure IoT Edge 部署模板符合 Docker Engine API,我找不到任何通过该 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")

当然,这是一个具有明显缺陷的人为示例,但它展示了解决方法的要点。

不,IotEdge 不支持按特定顺序初始化模块。 请注意,即使可以按特定顺序启动它们以解决依赖关系,如果其中一个模块崩溃,您仍然会遇到问题。 它将由EdgeHub重新启动,但您将失去初始化顺序。

Mike Yagley(IotEdge的贡献者之一)在github上解释了这个问题。

StartupOrder:在 IoT Edge 版本 1.0.10 中引入。IoT Edge 代理在首次部署时应启动模块的顺序。

最新更新