有没有办法强制执行模块间 dependencies/initialization 顺序?
Is there a way to enforce inter-module dependencies/initialization order?
使用 Azure IoT Edge,我还没有找到任何方法来保证 containers/modules 在部署中的初始化顺序。假设我有2个模块,A和B。A是服务器,B是依赖于A的客户端。据我所知,没有办法保证A先于B启动。
Azure IoT Edge 部署模板符合 Docker 引擎 API,我找不到任何方法通过 API 强制依赖。作为一种解决方法,我不假设每个容器的代码中哪些容器是 运行。这是有效的,尽管额外代码的开销并不理想,特别是考虑到像 docker-compose 这样的工具会使强制初始化顺序变得相当微不足道。
我想做这样的事情(来源: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 代理应按哪个顺序启动模块。
使用 Azure IoT Edge,我还没有找到任何方法来保证 containers/modules 在部署中的初始化顺序。假设我有2个模块,A和B。A是服务器,B是依赖于A的客户端。据我所知,没有办法保证A先于B启动。
Azure IoT Edge 部署模板符合 Docker 引擎 API,我找不到任何方法通过 API 强制依赖。作为一种解决方法,我不假设每个容器的代码中哪些容器是 运行。这是有效的,尽管额外代码的开销并不理想,特别是考虑到像 docker-compose 这样的工具会使强制初始化顺序变得相当微不足道。
我想做这样的事情(来源: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 代理应按哪个顺序启动模块。