Windows Server 2016下构建带.NET 5.0的Docker镜像时VS2019生成工具安装失败
Windows Server 2016 环境Docker构建.NET 5.0镜像VS2019生成工具安装失败解决方案
核心问题根因
- Docker镜像构建过程中无法执行系统重启操作,dotnetfx安装后返回3010退出码标记系统待重启,导致后续VS2019生成工具的安装前置检查不通过直接报错
- Windows Server 2016宿主仅兼容内核版本为1607的Windows容器镜像,无法直接使用更高版本的预配置.NET 5镜像
具体解决方法
调整Dockerfile中Chocolatey包的安装参数,跳过待重启状态检查、标记3010为合法退出码,无需实际重启系统即可继续后续安装操作:
- 安装.NET 5 SDK时添加
--exitCodes=0,3010参数,将重启要求类退出码标记为安装成功状态 - 安装VS2019生成工具时添加
--ignore-pending-reboots参数,跳过系统待重启状态前置检查,同时可按需指定工作负载减少不必要组件安装 - 合并相关安装步骤减少镜像层体积,可选添加VS生成工具的工作负载参数适配实际项目编译需求
修改后的完整Dockerfile
# escape=` FROM mcr.microsoft.com/windows/servercore:1607 SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] # 安装Chocolatey RUN Write-Host "*********** Chocolatey Install"; ` Set-ExecutionPolicy Bypass -Scope Process -Force; ` [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; ` iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) # 安装Nuget RUN Write-Host "*********** NuGet Install"; ` choco install nuget.commandline --version=5.11.0 --yes # 安装.NET 5.0 SDK,接受3010重启退出码为正常状态 RUN Write-Host "*********** Install .Net 5.0"; ` choco install dotnet-5.0-sdk --version=5.0.402 --yes --exitCodes=0,3010 # 安装VS2019生成工具,忽略待重启检查,可按需添加工作负载参数 RUN Write-Host "*********** Download and Install Build Tools 2019"; ` choco install visualstudio2019buildtools --version=16.11.5.0 --yes ` --ignore-pending-reboots ` --package-parameters "--add Microsoft.VisualStudio.Workload.NetWeb --add Microsoft.VisualStudio.Workload.ManagedDesktop --includeOptional --passive --norestart"
额外注意事项
- 若项目编译需要其他VS组件,可在VS生成工具的
--package-parameters中追加对应工作负载ID即可 - 不要更换1607版本的base镜像,否则会出现宿主与容器内核版本不兼容的daemon报错
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

