.NET Framework 4.8控制台应用部署Azure容器实例失败求助
已在Docker Desktop成功运行应用,也能推送到Azure容器注册表,但创建Azure容器实例时失败。因项目依赖仅支持.NET Framework 4.8的第三方组件,无法切换至.NET 7(此前用.NET 7搭建测试实例成功),不清楚如何修改Dockerfile以使用官方列出的支持版本。
错误信息
{"code":"DeploymentFailed","target":"/subscriptions/.../deployments/Microsoft.ContainerInstances-20231003202653","message":"至少有一个资源部署操作失败。请列出部署操作以获取详细信息。请查看相关文档了解使用详情。","details":[{"code":"UnsupportedWindowsVersion","message":"不支持的Windows镜像版本。支持的版本包括 'Windows Server 2019 - Before 2B, Windows Server 2019 - After 2B, Windows Server, Version 1903 - After 2B, Windows Server, Version 2004, Windows Server 2022, Windows Server LTSC Preview Build'}]}
当前Dockerfile
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build WORKDIR /app COPY *.csproj . RUN dotnet restore COPY . . WORKDIR /app RUN dotnet publish -c Release -o out --no-restore FROM mcr.microsoft.com/dotnet/framework/runtime:4.8 AS runtime WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["MyApp.exe"]
SDK风格项目文件
<Project Sdk="Microsoft.NET.Sdk;Microsoft.NET.Sdk.Publish"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net48</TargetFramework> <DockerDefaultTargetOS>Windows</DockerDefaultTargetOS> <DockerfileContext>.</DockerfileContext> <ApplicationManifest>app.manifest</ApplicationManifest> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" /> </ItemGroup> </Project>
app.manifest(用于提升权限读写注册表)
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="WorkShark48.exe" /> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>
解决方案
问题根源是默认的mcr.microsoft.com/dotnet/framework/sdk:4.8和runtime:4.8镜像使用的Windows版本不在Azure容器实例支持列表内,需给镜像指定具体的支持版本标签。
修改方案1:使用Windows Server 2022版本镜像
# 构建阶段选用Windows Server 2022的SDK镜像 FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2022 AS build WORKDIR /app COPY *.csproj . RUN dotnet restore COPY . . WORKDIR /app RUN dotnet publish -c Release -o out --no-restore # 运行阶段匹配对应版本的runtime镜像 FROM mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2022 AS runtime WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["MyApp.exe"]
修改方案2:使用Windows Server 2019版本镜像
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 AS build WORKDIR /app COPY *.csproj . RUN dotnet restore COPY . . WORKDIR /app RUN dotnet publish -c Release -o out --no-restore FROM mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2019 AS runtime WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["MyApp.exe"]
验证步骤
- 修改Dockerfile后重新构建镜像:
docker build -t myapp:v2 . - 推送新镜像到Azure容器注册表:
docker push <你的ACR地址>/myapp:v2 - 使用新镜像创建Azure容器实例,确认部署成功。
注:选择的镜像Windows版本需与错误信息中列出的支持版本匹配,ltsc2022对应Windows Server 2022,ltsc2019对应Windows Server 2019,均为Azure容器实例支持版本。
内容的提问来源于stack exchange,提问作者George Kravchenko

