scripts/Switch-DockerContainerMode.ps1
View raw file
<#
.SYNOPSIS
Switches Docker Desktop between Linux and Windows container modes.
#>
# Switch-DockerContainerMode.ps1
# Switches Docker Desktop between Linux and Windows container modes
param(
[Parameter(Mandatory = $false)]
[ValidateSet('Linux', 'Windows', 'Auto')]
[string]$Mode = 'Auto',
[Parameter(Mandatory = $false)]
[switch]$Help,
[Parameter(Mandatory = $false)]
[switch]$Status
)
# Display help
if ($Help) {
Write-Host "`nSwitch-DockerContainerMode.ps1" -ForegroundColor Cyan
Write-Host "Switches Docker Desktop between Linux and Windows container modes`n" -ForegroundColor White
Write-Host "USAGE:" -ForegroundColor Yellow
Write-Host " .\Switch-DockerContainerMode.ps1 [-Mode <Linux|Windows|Auto>] [-Status] [-Help]`n"
Write-Host "PARAMETERS:" -ForegroundColor Yellow
Write-Host " -Mode <String>" -ForegroundColor Green
Write-Host " Linux : Switch to Linux containers"
Write-Host " Windows : Switch to Windows containers"
Write-Host " Auto : Toggle between modes (default)`n"
Write-Host " -Status" -ForegroundColor Green
Write-Host " Display current Docker container mode without switching`n"
Write-Host " -Help" -ForegroundColor Green
Write-Host " Display this help message`n"
Write-Host "EXAMPLES:" -ForegroundColor Yellow
Write-Host " .\Switch-DockerContainerMode.ps1"
Write-Host " Toggles between Linux and Windows containers`n"
Write-Host " .\Switch-DockerContainerMode.ps1 -Mode Linux"
Write-Host " Switches to Linux containers`n"
Write-Host " .\Switch-DockerContainerMode.ps1 -Status"
Write-Host " Shows current container mode`n"
exit 0
}
# Path to Docker Desktop CLI
$dockerCliPath = "C:\Program Files\Docker\Docker\DockerCli.exe"
# Check if Docker Desktop CLI exists
if (-not (Test-Path $dockerCliPath)) {
Write-Error "Docker Desktop CLI not found at: $dockerCliPath"
Write-Error "Please ensure Docker Desktop is installed."
exit 1
}
# Function to get current container mode
function Get-CurrentDockerMode {
try {
$dockerInfo = docker info 2>&1 | Out-String
if ($dockerInfo -match "OSType:\s*(\w+)") {
return $matches[1]
}
return "Unknown"
}
catch {
Write-Warning "Could not determine current Docker mode: $_"
return "Unknown"
}
}
# Get current mode
$currentMode = Get-CurrentDockerMode
# Handle -Status flag
if ($Status) {
Write-Host "`nDocker Container Mode Status:" -ForegroundColor Cyan
Write-Host "Current mode: $currentMode" -ForegroundColor Green
# Additional info
try {
$dockerVersion = docker version --format '{{.Server.Version}}' 2>$null
if ($dockerVersion) {
Write-Host "Docker version: $dockerVersion" -ForegroundColor White
}
}
catch {
# Ignore errors
}
Write-Host ""
exit 0
}
Write-Host "Current Docker container mode: $currentMode" -ForegroundColor Cyan
# Determine target mode
$targetMode = $Mode
if ($Mode -eq 'Auto') {
# Toggle mode
if ($currentMode -eq 'linux') {
$targetMode = 'Windows'
}
elseif ($currentMode -eq 'windows') {
$targetMode = 'Linux'
}
else {
Write-Error "Cannot determine current mode to toggle. Please specify -Mode explicitly."
exit 1
}
}
# Check if already in target mode
if ($currentMode.ToLower() -eq $targetMode.ToLower()) {
Write-Host "Already in $targetMode container mode. No action needed." -ForegroundColor Green
exit 0
}
# Switch to target mode
Write-Host "Switching to $targetMode containers..." -ForegroundColor Yellow
try {
if ($targetMode -eq 'Windows') {
& $dockerCliPath -SwitchWindowsEngine
Write-Host "Switched to Windows containers successfully!" -ForegroundColor Green
}
elseif ($targetMode -eq 'Linux') {
& $dockerCliPath -SwitchLinuxEngine
Write-Host "Switched to Linux containers successfully!" -ForegroundColor Green
}
# Wait a moment for Docker to restart
Write-Host "Waiting for Docker to restart..." -ForegroundColor Yellow
Start-Sleep -Seconds 5
# Verify the switch
$newMode = Get-CurrentDockerMode
Write-Host "New Docker container mode: $newMode" -ForegroundColor Cyan
if ($newMode.ToLower() -eq $targetMode.ToLower()) {
Write-Host "Mode switch verified successfully!" -ForegroundColor Green
}
else {
Write-Warning "Mode switch may still be in progress. Please verify with 'docker info'."
}
}
catch {
Write-Error "Failed to switch Docker mode: $_"
exit 1
}