.NET6程序以容器的形式在arm架构中运行
最近一个项目需要在arm开发板上运行.NET程序,并以docker容器的方式运行。
因为开发板内存性能不能跟专用服务器比,所以.NET程序的编译和镜像打包放在公司的x86架构的服务器上,构建好镜像再放到板子上。
1、修改dockerfile
主要是asp.net和sdk的镜像替换成了arm架构的,dotnet指令需要加上参数 -r linux-arm64 --self-contained false 指定运行平台
PS:友情提示,如果数据库用到了sqllite,.NET运行时镜像不建议使用alpine版本,会出现各种问题
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8 AS base ENV ASPNETCORE_URLS http://+:8871 EXPOSE 8871 FROM mcr.microsoft.com/dotnet/sdk:6.0-focal-arm64v8 AS build WORKDIR /src
#先拷贝项目文件,下载依赖 COPY ["dotnetapi/dotnetapi.csproj", "dotnetapi/"] RUN dotnet restore -r linux-arm64 "EdgeGatewayApi/EdgeGatewayApi.csproj"
#再拷贝全部文件 COPY . . WORKDIR "/src/EdgeGatewayApi" FROM build AS publish RUN dotnet publish -r linux-arm64 --self-contained false -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ENTRYPOINT ["dotnet", "dotnetapi.dll"]
2、构建镜像 必须使用 buildx 多平台构建(使用buildx有个非常重要的前提条件:docker版本为Docker 19.03+)
如何在docker上进行多平台构建请参考,请务必按以下文章完成,docker才可以使用buildx指令
https://docs.docker.com/build/building/multi-platform/
docker buildx build --platform linux/arm64 -t dotnetapi . --load
3、后面都是正常流程,导出镜像,拷贝到arm服务器上,导入镜像,跑容器就行
参考资料: