Azure Functions隔离式.NET7的Dockerfile为何混用Runtime6.0与SDK7.0?
为何.NET 7.0隔离式Azure函数的Dockerfile中同时使用.NET 6.0 Runtime和7.0 SDK?
在Visual Studio 17.4.3中创建启用Docker的.NET 7.0隔离式工作进程(Isolated worker process)函数应用时,生成了如下Dockerfile模板。已知隔离式工作进程明确支持.NET 7.0,请问为何要同时使用版本不同的Runtime(6.0)和SDK(7.0)?
FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated7.0 AS base WORKDIR /home/site/wwwroot EXPOSE 80 FROM mcr.microsoft.com/dotnet/runtime:6.0 as runtime6.0 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build # Copy .NET Core 6.0 runtime from the 6.0 image COPY --from=runtime6.0 /usr/share/dotnet/host /usr/share/dotnet/host COPY --from=runtime6.0 /usr/share/dotnet/shared /usr/share/dotnet/shared WORKDIR /src COPY ["FunctionApp1/FunctionApp1.csproj", "FunctionApp1/"] RUN dotnet restore "FunctionApp1/FunctionApp1.csproj" COPY . . WORKDIR "/src/FunctionApp1" RUN dotnet build "FunctionApp1.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "FunctionApp1.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /home/site/wwwroot COPY --from=publish /app/publish . ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true
这是因为Azure Functions 4.x运行时的宿主进程依赖.NET 6.0,而隔离式工作进程本身使用.NET 7.0,具体原因如下:
- 隔离式模型里,你的函数代码运行在独立的.NET 7.0工作进程中,所以必须用.NET 7.0 SDK来完成代码的构建和发布操作,保证代码能适配目标运行时。
- Azure Functions的核心宿主组件(负责函数触发、生命周期管理、请求路由等核心逻辑)是基于.NET 6.0开发的,构建阶段引入.NET 6.0 Runtime是为了让构建环境和最终的Azure Functions运行环境保持依赖一致,避免出现宿主组件无法正常加载或运行的兼容性问题。
这种写法兼顾了函数代码的.NET 7.0构建需求,以及Azure Functions宿主对.NET 6.0的依赖,确保最终生成的Docker镜像能在Azure Functions 4.x平台上稳定运行。
内容的提问来源于stack exchange,提问作者Kristoffer Jälén
相关产品推荐
相关产品推荐

