【问题标题】:Is there a way to enforce inter-module dependencies/initialization order?有没有办法强制执行模块间依赖/初始化顺序?
【发布时间】:2019-05-08 17:29:00
【问题描述】:

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

Azure IoT Edge 部署模板符合 Docker 引擎 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 容器中,我一直在执行以下操作,以确保postgresweb 执行postgres 相关操作之前启动并运行:

postgresIsUp = False
while not postgresIsUp:
    try:
        pingPostgres()
        postgresIsUp = True
    except PingError:
        print("postgres is not yet running")

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

【问题讨论】:

    标签: docker azure-iot-edge docker-engine


    【解决方案1】:

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

    Mike Yagley(IotEdge 的贡献者之一)在 github 上对此问题进行了解释。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 2018-02-25
        • 2022-11-02
        • 2016-01-05
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        相关资源
        最近更新 更多