Windows 10系统下如何在Docker容器中运行.NET exe应用程序
解决Windows 10 21H1无Hyper-V环境下Docker运行.NET exe的方案
问题根因
你当前关闭了Hyper-V,Docker Windows容器只能使用进程隔离模式,该模式要求容器镜像与宿主系统的内核版本严格兼容。win10-21h1-preview预览版镜像与你正式版21H1的内部版本号不匹配,所以会触发OS不匹配报错;仅2004版本的Windows容器镜像支持在21H1系统的进程隔离模式下正常运行。
方案1:使用预配.NET运行时的2004系列官方镜像(推荐)
微软官方已发布基于nanoserver:2004构建的.NET运行时/SDK镜像,无需自行配置依赖,直接使用即可:
- 若运行.NET Core/.NET 5+ 应用:选择对应版本的nanoserver-2004 tag,例如.NET 6运行时镜像为
mcr.microsoft.com/dotnet/runtime:6.0-nanoserver-2004,.NET 7对应mcr.microsoft.com/dotnet/runtime:7.0-nanoserver-2004 - 若运行.NET Framework应用:选择
mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-2004,镜像已预装.NET Framework 4.8,自带完整PowerShell环境
多阶段构建Dockerfile示例(编译+运行.NET 6应用)
# 构建阶段:使用SDK镜像编译代码 FROM mcr.microsoft.com/dotnet/sdk:6.0-nanoserver-2004 AS build WORKDIR /src COPY MyApp.csproj . RUN dotnet restore MyApp.csproj COPY . . RUN dotnet publish MyApp.csproj -c Release -o /app/publish # 运行阶段:仅保留运行时和编译产物,镜像体积更小 FROM mcr.microsoft.com/dotnet/runtime:6.0-nanoserver-2004 AS final WORKDIR /app COPY --from=build /app/publish . ENTRYPOINT ["dotnet", "MyApp.exe"]
如果你的exe已经本地编译为自包含部署包,可直接简化为:
FROM mcr.microsoft.com/dotnet/runtime:6.0-nanoserver-2004 WORKDIR /app COPY ./publish/ . ENTRYPOINT ["MyApp.exe"]
方案2:基于servercore:2004自行安装依赖
如果你的.NET应用有额外系统依赖,需要PowerShell等工具,可选择windows/servercore:2004作为基础镜像自行配置环境:
FROM mcr.microsoft.com/windows/servercore:2004 WORKDIR /app # 安装.NET运行时,可自行替换为对应版本的官方运行时安装包地址 RUN powershell -Command \ Invoke-WebRequest -Uri [对应版本.NET运行时官方下载地址] -OutFile dotnet-runtime.exe ; \ Start-Process -FilePath dotnet-runtime.exe -ArgumentList '/install /quiet /norestart' -Wait ; \ Remove-Item -Force dotnet-runtime.exe RUN setx PATH "%PATH%;C:\Program Files\dotnet" COPY ./app/ . ENTRYPOINT ["MyApp.exe"]
注意事项
- 所有基础镜像请选择tag带2004的版本,更高版本的镜像无法在你当前的进程隔离环境下启动
- 如果是32位.NET程序,需对应安装32位.NET运行时,或选择32位版本的基础镜像
- 若程序需要WCF、注册表访问等Windows高级组件,优先选择servercore系列镜像,nanoserver镜像裁剪了大量系统组件,可能存在依赖缺失
内容的提问来源于stack exchange,提问作者Sorin-Alexandru Cristescu
相关产品推荐
相关产品推荐

