【问题标题】:IotEdge - Error calling Create module image-classifier-serviceIotEdge - 调用创建模块图像分类器服务时出错
【发布时间】:2019-05-29 00:59:55
【问题描述】:

我对 Azure IoT Edge 非常陌生,我正在尝试部署到我的 Raspberry PI:使用 Azure IoT Edge 和认知服务进行图像识别 但是在构建和推送 IoT Edge 解决方案并将其部署到单个设备 ID 之后,我看不到 Docker PS -a 和 Iotedge 列表中列出的这两个模块 当尝试在 EdgeAgent 日志上检查它时,会出现错误消息,并且似乎 EdgeAgent 在创建这些模块(相机捕获和图像分类器服务)时出错

我试过了: 1.从新的文件夹包重新构建它 2、从Azure Portal手动拉取镜像,通过脚本手动运行镜像

我被困在这个问题上好几天了。

在这些模块的 deployment.arm32v7.json 中,我使用注册的注册表 url 定义图像:

"modules": {
          "camera-capture": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "zzzz.azurecr.io/camera-capture-opencv:1.1.12-arm32v7",
              "createOptions": "{\"Env\":[\"Video=0\",\"azureSpeechServicesKey=2f57f2d9f1074faaa0e9484e1f1c08c1\",\"AiEndpoint=http://image-classifier-service:80/image\"],\"HostConfig\":{\"PortBindings\":{\"5678/tcp\":[{\"HostPort\":\"5678\"}]},\"Devices\":[{\"PathOnHost\":\"/dev/video0\",\"PathInContainer\":\"/dev/video0\",\"CgroupPermissions\":\"mrw\"},{\"PathOnHost\":\"/dev/snd\",\"PathInContainer\":\"/dev/snd\",\"CgroupPermissions\":\"mrw\"}]}}"
            }
          },
          "image-classifier-service": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "zzzz.azurecr.io/image-classifier-service:1.1.5-arm32v7",
              "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/pi/images:/images\"],\"PortBindings\":{\"8000/tcp\":[{\"HostPort\":\"80\"}],\"5679/tcp\":[{\"HostPort\":\"5679\"}]}}}"
            }

来自 EdgeAgent 日志的错误消息:

(Inner Exception #0) Microsoft.Azure.Devices.Edge.Agent.Edgelet.EdgeletCommunicationException- Message:Error calling Create module
image-classifier-service: Could not create module image-classifier-service
        caused by: Could not pull image zzzzz.azurecr.io/image-classifier-service:1.1.5-arm32v7
        caused by: Get https://zzzzz.azurecr.io/v2/image-classifier-service/manifests/1.1.5-arm32v7: unauthorized: authentication required

尝试通过脚本运行拉取的图像时:

sudo docker run --rm --name testName -it zzzz.azurecr.io/camera-capture-opencv:1.1.12-arm32v7

我收到此错误:

Camera Capture Azure IoT Edge Module. Press Ctrl-C to exit.
Error: Time:Fri May 24 10:01:09 2019 File:/usr/sdk/src/c/iothub_client/src/iothub_client_core_ll.c Func:retrieve_edge_environment_variabes Line:191 Environment IOTEDGE_AUTHSCHEME not set
Error: Time:Fri May 24 10:01:09 2019 File:/usr/sdk/src/c/iothub_client/src/iothub_client_core_ll.c Func:IoTHubClientCore_LL_CreateFromEnvironment Line:1572 retrieve_edge_environment_variabes failed
Error: Time:Fri May 24 10:01:09 2019 File:/usr/sdk/src/c/iothub_client/src/iothub_client_core.c Func:create_iothub_instance Line:941 Failure creating iothub handle
Unexpected error IoTHubClient.create_from_environment, IoTHubClientResult.ERROR from IoTHub

【问题讨论】:

  • 当您使用 docker run 拉取它时,它拉取但随后未能在预期的边缘运行时之外运行。但是当边缘代理尝试拉取它时,由于授权失败。您是否将 zzzz.azurecr.io 凭据添加到部署中?
  • 正如Damon所说:你的deployment.json中有registryCredentials吗? docs.microsoft.com/en-us/azure/iot-edge/…
  • 嗨 Damon & Silent,感谢您的回复,是的,我已将凭据添加到我的 deployment.arm32v7.json 中:“registryCredentials”:{“techlabid”:{“username”:“${我的注册表用户名}”,“密码”:“${我的注册表密码}”,“地址”:“zzzz.azurecr.io”}这有什么问题吗?
  • 对不起,我刚刚发现给定的注册表凭据不正确 - 与给定的链接相比。它应该是直接值,例如 Username : myusername without ${} 我重新构建并重新部署它,它现在可以工作了。谢谢你们

标签: azure azure-iot-hub azure-iot-edge


【解决方案1】:

当您直接使用docker run 拉取图像时,它拉取但随后未能在边缘运行时之外运行,这是预期的。但是当边缘代理试图拉取它时,它失败了,因为它没有被授权。没有向运行时提供凭据,因此它试图匿名访问注册表。

确保将容器注册表凭据添加到部署中,以便边缘运行时可以提取图像。部署应在运行时设置中包含以下内容:

"MyRegistry" :{
  "username": "<username>",
  "password": "<password>",
  "address": "<registry-name>.azurecr.io"
}

正如 @silent 在 cmets 中指出的那样,文档是 here,包括一个包含容器注册表凭据的示例部署。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多