尝试 运行 Windows 主机上的 Linux 容器时出现 IoT Edge 代理错误:"image operating system "linux“无法在此平台上使用”
Getting IoT Edge Agent error trying to run a Linux container on Windows host: "image operating system "linux" cannot be used on this platform"
我正在尝试在 Windows 主机上创建 Azure IoT Edge 设备,但 运行 将模块构建为 Linux 容器。在之前的实验中,我能够在 Linux 主机上成功创建一个 Azure IoT Edge 设备,并成功地 运行ning 这个相同的 Linux 容器模块。
但是,当我将模块部署到 Windows 主机上时,模块显示它不是 运行ning,当我使用 "iotedge logs camera-capture" 查看模块的日志时,我得到以下错误:
<6> 2019-12-02 13:32:56.016 -08:00 [INF] - Executing command: "Create module camera-capture"
<3> 2019-12-02 13:33:11.674 -08:00 [ERR] - Executing command for operation ["create"] failed.
Microsoft.Azure.Devices.Edge.Agent.Edgelet.EdgeletCommunicationException- Message:Error calling Create module camera-capture: Could not create module camera-capture
caused by: Could not pull image localhost:5000/camera-capture-opencv:1.1.128-amd64
caused by: image operating system "linux" cannot be used on this platform, StatusCode:500, at: at Microsoft.Azure.Devices.Edge.Agent.Edgelet.Version_2019_01_30.ModuleManagementHttpClient.HandleException(Exception exception, String operation) in C:\agent\_work\s\edge-agent\src\Microsoft.Azure.Devices.Edge.Agent.Edgelet\version_2019_01_30\ModuleManagementHttpClient.cs:line 194
我没有在网上或通过 Microsoft 论坛找到任何关于能够解决我的问题的特定错误的结果。作为记录,我已确保:
- 我正在 运行 兼容 Windows 10 主机 (17763)
- 我安装了 Hyper-V 和容器
- 我在 BIOS 中启用了 VT
- 我已将我的 deployment.template.json 配置为构建为 "amd64" 平台
- 我已经使用 Linux 容器将我的 Docker 桌面配置为 运行(并且还启用了实验模式)
- 我已经在线测试了基本的 "hello-world" ubuntu 示例,当我从 Powershell 运行 它时它可以工作,这证明 Linux 容器将 运行 在我的 Windows 主机上
如有任何帮助,我们将不胜感激!
在这个问题上卡了几天之后,我终于找到了解决办法。问题是 Windows 上的 IoT Edge 运行时未配置为处理 Linux 容器!
在撰写本文时,Microsoft 在此处记录了解决方案:https://docs.microsoft.com/en-us/azure/iot-edge/how-to-install-iot-edge-windows-with-linux
但如果将来出现故障 link,您基本上必须在安装 Azure IoT Edge 运行时以处理 linux 容器时添加额外的标志。
. {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
Deploy-IoTEdge -ContainerOs Linux
. {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
Initialize-IoTEdge -ContainerOs Linux
我将 Docker 桌面更改为 Linux 容器模式并在 VSCode 中编译。它像魔术一样工作。
我正在尝试在 Windows 主机上创建 Azure IoT Edge 设备,但 运行 将模块构建为 Linux 容器。在之前的实验中,我能够在 Linux 主机上成功创建一个 Azure IoT Edge 设备,并成功地 运行ning 这个相同的 Linux 容器模块。
但是,当我将模块部署到 Windows 主机上时,模块显示它不是 运行ning,当我使用 "iotedge logs camera-capture" 查看模块的日志时,我得到以下错误:
<6> 2019-12-02 13:32:56.016 -08:00 [INF] - Executing command: "Create module camera-capture"
<3> 2019-12-02 13:33:11.674 -08:00 [ERR] - Executing command for operation ["create"] failed.
Microsoft.Azure.Devices.Edge.Agent.Edgelet.EdgeletCommunicationException- Message:Error calling Create module camera-capture: Could not create module camera-capture
caused by: Could not pull image localhost:5000/camera-capture-opencv:1.1.128-amd64
caused by: image operating system "linux" cannot be used on this platform, StatusCode:500, at: at Microsoft.Azure.Devices.Edge.Agent.Edgelet.Version_2019_01_30.ModuleManagementHttpClient.HandleException(Exception exception, String operation) in C:\agent\_work\s\edge-agent\src\Microsoft.Azure.Devices.Edge.Agent.Edgelet\version_2019_01_30\ModuleManagementHttpClient.cs:line 194
我没有在网上或通过 Microsoft 论坛找到任何关于能够解决我的问题的特定错误的结果。作为记录,我已确保:
- 我正在 运行 兼容 Windows 10 主机 (17763)
- 我安装了 Hyper-V 和容器
- 我在 BIOS 中启用了 VT
- 我已将我的 deployment.template.json 配置为构建为 "amd64" 平台
- 我已经使用 Linux 容器将我的 Docker 桌面配置为 运行(并且还启用了实验模式)
- 我已经在线测试了基本的 "hello-world" ubuntu 示例,当我从 Powershell 运行 它时它可以工作,这证明 Linux 容器将 运行 在我的 Windows 主机上
如有任何帮助,我们将不胜感激!
在这个问题上卡了几天之后,我终于找到了解决办法。问题是 Windows 上的 IoT Edge 运行时未配置为处理 Linux 容器! 在撰写本文时,Microsoft 在此处记录了解决方案:https://docs.microsoft.com/en-us/azure/iot-edge/how-to-install-iot-edge-windows-with-linux
但如果将来出现故障 link,您基本上必须在安装 Azure IoT Edge 运行时以处理 linux 容器时添加额外的标志。
. {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
Deploy-IoTEdge -ContainerOs Linux
. {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
Initialize-IoTEdge -ContainerOs Linux
我将 Docker 桌面更改为 Linux 容器模式并在 VSCode 中编译。它像魔术一样工作。