无法为Arm32v7(树莓派)构建含外部Assembly的Docker镜像
本地构建运行正常的ASP.NET应用,在为Arm32v7(树莓派)构建Docker镜像时,出现如下引用解析警告:
warning MSB3245: Could not resolve this reference. Could not locate the assembly "SAM Shared". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
当前使用的Dockerfile内容如下:
#Below is changed to use the appropiate image for Rpi, arm32v7 FROM mcr.microsoft.com/dotnet/aspnet:6.0.1-bullseye-slim-arm32v7 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["HomeMonitor/HomeMonitor.csproj", "HomeMonitor/"] COPY ["HomeMonitor.Shared/HomeMonitor.Shared.csproj", "HomeMonitor.Shared/"] RUN dotnet restore "HomeMonitor/HomeMonitor.csproj" COPY . . WORKDIR "/src/HomeMonitor" RUN dotnet build "HomeMonitor.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "HomeMonitor.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "HomeMonitor.dll"]
核对项目引用与程序集名称
确认警告里的"SAM Shared"是否就是本地引用的HomeMonitor.Shared项目。打开HomeMonitor.Shared.csproj文件,检查<AssemblyName>节点的值,如果确实是"SAM Shared",要保证Docker构建过程中该项目的输出能被主项目正确识别。调整Docker构建的项目编译顺序
当前Dockerfile先复制csproj文件执行restore,再复制全部代码,但如果HomeMonitor.Shared的输出路径或引用配置有特殊设置,可能导致构建时找不到依赖。可以在复制全部代码后,先编译共享项目再编译主项目:
修改build阶段的命令:COPY . . WORKDIR "/src/HomeMonitor.Shared" RUN dotnet build "HomeMonitor.Shared.csproj" -c Release WORKDIR "/src/HomeMonitor" RUN dotnet build "HomeMonitor.csproj" -c Release -o /app/build指定Arm32v7目标构建平台
build阶段用的是通用x64 SDK镜像,跨平台构建可能出现引用解析问题。在dotnet build和dotnet publish命令中添加目标架构参数:RUN dotnet build "HomeMonitor.csproj" -c Release -o /app/build -r linux-arm # publish阶段同步修改 RUN dotnet publish "HomeMonitor.csproj" -c Release -o /app/publish /p:UseAppHost=false -r linux-arm同时更新restore命令,指定目标平台:
RUN dotnet restore "HomeMonitor/HomeMonitor.csproj" -r linux-arm检查项目引用的路径配置
打开HomeMonitor.csproj文件,查看对HomeMonitor.Shared的引用节点,确认相对路径在Docker容器的/src目录下是否正确。比如引用节点应为:<ProjectReference Include="..\HomeMonitor.Shared\HomeMonitor.Shared.csproj" />确保容器内
/src/HomeMonitor和/src/HomeMonitor.Shared的目录结构与本地一致。
内容的提问来源于stack exchange,提问作者jason.kaisersmith

