我已经开发了一个模块并为arm64v8架构构建了镜像,因为我的Edge设备在Raspberry Pi 4中运行。我在config文件夹中正确获取了deployment.arm64v8.json文件。但是,当我在 Visual Studio Code 中右键单击设备并选择“为单个设备创建部署”时,会添加模块,但其中一个模块显示退避状态。这里可能是什么问题,严格遵循this doc .
我还尝试重新启动服务。
设备信息
主机操作系统:Raspberry OS 架构:Arm64v8 容器操作系统:Linux 容器
运行时版本
iotedge:iotedge 1.0.9.4 Docker/Moby [运行 docker 版本]:更新:
我正在尝试在我的 64 位 Windows 开发机中构建 arm32 镜像,我想这就是我遇到此问题的原因。现在我有 3 个选择。
- 从此处安装 64 位版本的 Raspberry OS
- 设置 32 位虚拟机并将其用作开发机并 构建 32 位图像
- 我已经运行了 WSL,可能正在运行 Visual Studio 代码 解决办法有吗?
您能告诉我什么是更好的方法吗?
最佳答案
有几个问题我做错了。首先,我试图在我的 64 位 Windows 开发机中构建一个 arm64 镜像,然后将该镜像部署到 arm32 Raspbian 操作系统,这永远不会工作。您可以通过运行以下命令查看版本和其他详细信息。
如果显示aarch64
,那么它是 64 位。如果显示 armv7l
那么它就是 32 位。就我而言,它是arm71
。因此,现在我必须在 64 位 Windows 主机
上构建 arm32
容器镜像,并在我的 Raspberry Pi 4
上使用它。根据this doc ,这绝对是可能的。
You can build ARM32 and ARM64 images on x64 machines, but you will not be able to run them
运行不是我的问题,因为我只需要构建图像,然后我将在我的 Raspberry Pi 中使用它。为了使其工作,我必须更改我的 Dockerfile.arm32v7
,特别是我们拉取基本镜像的第一行。
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build-env
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7
WORKDIR /app
COPY --from=build-env /app/out ./
RUN useradd -ms /bin/bash moduleuser
USER moduleuser
ENTRYPOINT ["dotnet", "SendTelemetry.dll"]
“build-env”镜像应与主机操作系统具有相同的架构,最终镜像应为目标操作系统架构。对 docker 文件进行更改后,我更改了模块文件夹内的 module.json
文件中的版本,以便在使用时带有新标签的新镜像将添加到容器注册表中右键单击 deployment.template.json
后选择 Build and Push IoT Edge Solution
选项,然后使用Create Deployment for Single Device
选项右键单击 Visual Studio Code 中的设备名称。然后,当我监视设备(开始监视内置事件端点选项)时,我会得到此输出。
对于这个问题,Microsoft 的支持非常出色。他们真的帮助我解决了这个问题GitHub issue我已经发布了。
关于azure - IoT Edge 模块之一处于退避状态 具有 Raspbian OS 的 Raspberry Pi 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63249180/