Windows2019中CustomScriptExtension部署脚本失败问题排查
问题分析
从日志和现象来看,核心问题出在以下两点:
- 计划任务注册失败:微软官方的
install-docker-ce.ps1脚本在启用Windows Containers功能后,会尝试创建一个计划任务用于重启后自动完成Docker安装。但CustomScriptExtension默认以Local System账户执行,该账户无法创建关联普通用户的计划任务,触发错误No mapping between account names and security IDs was done(错误代码0x80070534),导致后续安装步骤中断。 - 重启后无后续执行:虽然脚本触发了VM重启,但因为计划任务创建失败,重启后没有自动继续执行Docker引擎的下载和安装流程,最终导致Docker未完成部署。
解决方案
根据你的私有镜像限制,提供以下几种可行方案:
方案1:拆分扩展,分阶段执行(推荐)
将Docker安装拆分为两个独立的CustomScriptExtension,先启用Containers功能并重启VM,再完成Docker安装:
第一步:启用Containers功能并重启VM
resource "azurerm_virtual_machine_extension" "enable-containers" { for_each = local.XXXXXX name = "${each.key}-enable-containers" virtual_machine_id = module.XXXXXXXX[each.key].virtual_machine_id publisher = "Microsoft.Compute" type = "CustomScriptExtension" type_handler_version = "1.10" settings = <<SETTINGS { "commandToExecute" : "powershell -ExecutionPolicy Unrestricted -Command 'Install-WindowsFeature Containers; Restart-Computer -Force'" } SETTINGS }
第二步:重启后安装Docker
依赖第一个扩展完成后,执行脚本完成Docker安装(使用-SkipRestart参数跳过内置的重启和计划任务逻辑):
resource "azurerm_virtual_machine_extension" "install-docker" { for_each = local.XXXXXX name = "${each.key}-install-docker" virtual_machine_id = module.XXXXXXXX[each.key].virtual_machine_id publisher = "Microsoft.Compute" type = "CustomScriptExtension" type_handler_version = "1.10" depends_on = [azurerm_virtual_machine_extension.enable-containers] settings = <<SETTINGS { "commandToExecute" : "powershell -ExecutionPolicy Unrestricted -File install-docker-ce.ps1 -SkipRestart", "fileUris" : ["https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1"] } SETTINGS }
方案2:修改官方脚本,适配Local System账户
下载官方的install-docker-ce.ps1脚本,修改计划任务注册逻辑,指定使用Local System账户创建任务:
- 找到脚本中
Register-ScheduledTask的代码行(约第150行),修改为:
Register-ScheduledTask -TaskName $global:BootstrapTask -Action $action -Trigger $trigger -RunLevel Highest -User "NT AUTHORITY\SYSTEM" -Force
- 将修改后的脚本上传到你的私有存储(如Azure存储账户,生成SAS URL确保VM可访问)
- 在Terraform中引用私有存储的脚本URL:
resource "azurerm_virtual_machine_extension" "bootstrap-scripts" { for_each = local.XXXXXX name = "${each.key}-bootstrap" virtual_machine_id = module.XXXXXXXX[each.key].virtual_machine_id publisher = "Microsoft.Compute" type = "CustomScriptExtension" type_handler_version = "1.10" settings = <<SETTINGS { "commandToExecute" : "powershell -ExecutionPolicy Unrestricted -File install-docker-ce.ps1", "fileUris" : ["<你的私有存储脚本SAS URL>"] } SETTINGS }
方案3:手动补全安装(临时排查用)
如果需要快速验证,可RDP登录VM后手动执行以下步骤:
- 确认Containers功能已启用:
Get-WindowsFeature Containers - 直接执行脚本的安装逻辑:
powershell -ExecutionPolicy Unrestricted -File C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0\install-docker-ce.ps1 -SkipRestart
验证步骤
部署完成后,通过以下方式确认Docker安装成功:
- RDP登录VM,执行
docker info查看引擎状态 - 检查服务状态:
Get-Service Docker
内容的提问来源于stack exchange,提问作者PsyberMind
相关产品推荐
相关产品推荐

