<# 修复 Docker Desktop 起不来(引擎一直 Stopped、反复弹「恢复出厂设置」)的问题。 根因:Docker Desktop 崩溃后会留下僵尸 unix socket 文件(例: %LOCALAPPDATA%\Docker\run\dockerInference %LOCALAPPDATA%\docker-secrets-engine\engine.sock 这类文件在 Windows 上删不掉("系统无法访问此文件"),下次启动时 Docker 后端"先删后建"失败 → 再次崩溃 → 又弹重置框,形成死循环。 处理:把上面两个目录整体改名(不删除,可恢复),让 Docker 重新创建。 用法: pwsh -NoProfile -File scripts/docker-fix-start.ps1 # 只清理 pwsh -NoProfile -File scripts/docker-fix-start.ps1 -Start # 清理并启动,等引擎就绪 #> param( [switch]$Start, [int]$TimeoutSeconds = 240 ) $ErrorActionPreference = 'Stop' $apps = Get-Process -ErrorAction SilentlyContinue | Where-Object { $_.ProcessName -in @('Docker Desktop', 'com.docker.backend', 'docker') } if ($apps) { $apps | Stop-Process -Force -ErrorAction SilentlyContinue Write-Host ('已结束 Docker 相关进程:' + (($apps | Select-Object -ExpandProperty ProcessName -Unique) -join ', ')) Start-Sleep -Seconds 3 } $stamp = Get-Date -Format 'yyyyMMdd-HHmmss' $targets = @( (Join-Path $env:LOCALAPPDATA 'Docker\run'), (Join-Path $env:LOCALAPPDATA 'docker-secrets-engine') ) foreach ($path in $targets) { if (-not (Test-Path -LiteralPath $path)) { Write-Host "无需处理(不存在):$path" continue } $leaf = "$(Split-Path -Leaf $path).stale-$stamp" try { Rename-Item -LiteralPath $path -NewName $leaf -ErrorAction Stop Write-Host "已改名:$path -> $leaf" } catch { Write-Host "改名失败:$path($($_.Exception.Message))" } } if (-not $Start) { Write-Host '清理完成。加 -Start 可直接启动 Docker Desktop 并等待引擎就绪。' return } $exe = 'C:\Program Files\Docker\Docker\Docker Desktop.exe' if (-not (Test-Path -LiteralPath $exe)) { throw "找不到 Docker Desktop:$exe" } Start-Process -FilePath $exe Write-Host '已启动 Docker Desktop,等待引擎就绪…' $deadline = (Get-Date).AddSeconds($TimeoutSeconds) while ((Get-Date) -lt $deadline) { Start-Sleep -Seconds 10 $version = (docker version --format '{{.Server.Version}}' 2>$null) if ($version) { Write-Host "引擎已就绪:$version" exit 0 } } Write-Host '超时:引擎仍未就绪。请查看 Docker Desktop 窗口的错误提示(不要点「恢复出厂设置」)。' exit 1