Skip to content

Instantly share code, notes, and snippets.

@dakotahawkins
Created March 15, 2018 19:44
Show Gist options
  • Save dakotahawkins/2addec032d935da0b6f0de45296e1f45 to your computer and use it in GitHub Desktop.
Save dakotahawkins/2addec032d935da0b6f0de45296e1f45 to your computer and use it in GitHub Desktop.
Powershell Script to Update Docker-compose to the Latest Release
# Self-elevate the script if required
# http://www.expta.com/2017/03/how-to-self-elevate-powershell-script.html
If (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
If ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
$CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
Exit
}
}
$SectionSeparator = "--------------------------------------------------"
# Update docker-compose if required
Function UpdateDockerCompose() {
Write-Host "Updating docker-compose if required..."
Write-Host $SectionSeparator
# Find the installed docker-compose.exe location
Try {
$DockerComposePath = Get-Command docker-compose.exe -ErrorAction Stop | `
Select-Object -First 1 -ExpandProperty Definition
}
Catch {
Write-Host "Error: Could not find path to docker-compose.exe" `
-ForegroundColor Red
Return $false
}
# Prefer/enable TLS 1.2
# https://stackoverflow.com/a/48030563/153079
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
# Query for the latest release version
Try {
$URI = "https://api.github.com/repos/docker/compose/releases/latest"
$LatestComposeVersion = [System.Version](Invoke-RestMethod -Method Get -Uri $URI).tag_name
}
Catch {
Write-Host "Error: Query for the latest docker-compose release version failed" `
-ForegroundColor Red
Return $false
}
# Check the installed version and compare with latest release
$UpdateDockerCompose = $false
Try {
$InstalledComposeVersion = `
[System.Version]((docker-compose.exe version --short) | Out-String)
If ($InstalledComposeVersion -eq $LatestComposeVersion) {
Write-Host ("Installed docker-compose version ({0}) same as latest ({1})." `
-f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString())
}
ElseIf ($InstalledComposeVersion -lt $LatestComposeVersion) {
Write-Host ("Installed docker-compose version ({0}) older than latest ({1})." `
-f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString())
$UpdateDockerCompose = $true
}
Else {
Write-Host ("Installed docker-compose version ({0}) newer than latest ({1})." `
-f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString()) `
-ForegroundColor Yellow
}
}
Catch {
Write-Host `
"Warning: Couldn't get docker-compose version, assuming an update is required..." `
-ForegroundColor Yellow
$UpdateDockerCompose = $true
}
If (-Not $UpdateDockerCompose) {
# Nothing to do!
Return $false
}
# Download the latest version of docker-compose.exe
Try {
$RemoteFileName = "docker-compose-Windows-x86_64.exe"
$URI = ("https://github.com/docker/compose/releases/download/{0}/{1}" `
-f $LatestComposeVersion.ToString(), $RemoteFileName)
Invoke-WebRequest -UseBasicParsing -Uri $URI `
-OutFile $DockerComposePath
Return $true
}
Catch {
Write-Host ("Error: Failed to download the latest version of docker-compose`n{0}" `
-f $_.Exception.Message) -ForegroundColor Red
Return $false
}
Return $false
}
If (UpdateDockerCompose) {
Write-Host "Updated to latest-version of docker-compose, running update again to verify.`n"
If (UpdateDockerCompose) {
Write-Host "Error: Should not have updated twice." -ForegroundColor Red
}
}
# Assuming elevation popped up a new powershell window, pause so the user can see what happened
# https://stackoverflow.com/a/22362868/153079
Function Pause ($Message = "Press any key to continue . . . ") {
If ((Test-Path variable:psISE) -and $psISE) {
$Shell = New-Object -ComObject "WScript.Shell"
$Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
}
Else {
Write-Host "`n$SectionSeparator"
Write-Host -NoNewline $Message
[void][System.Console]::ReadKey($true)
Write-Host
}
}
Pause
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment