ContainerInfo/Get-NavContainerImageLabels.ps1

<#
 .Synopsis
  Get Labels for an image from the registry
 .Description
  Get the labels for an image from the registry without pulling the image
  This is also the best way to check whether a new version of an image is available
 .Parameter imageName
  Name of the image for which you want to get the labels
 .Parameter registryCredential
  Credentials for the registry if you are using a private registry (incl. bcinsider)
 .Example
  $created = (Get-BcContainerImageLabels -imageName myimage:mytag).created
#>

function Get-BcContainerImageLabels {
    Param (
        [string] $imageName,
        [PSCredential] $registryCredential
    )

$telemetryScope = InitTelemetryScope -name $MyInvocation.InvocationName -parameterValues $PSBoundParameters -includeParameters @()
try {

    [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
    $webclient = New-Object System.Net.WebClient

    if ($imageName.IndexOf("/") -lt 0) {
        try {
            return (docker inspect $imageName | ConvertFrom-Json).Config.Labels
        }
        catch {
            return
        }
    }

    $registry = $imageName.Split("/")[0]
    $repository = $imageName.Substring($registry.Length+1).Split(":")[0]
    $tag = $imageName.Split(":")[1]
    if ("$tag" -eq "") {
        $tag = "w1"
    }

    $authorization = ""

    if ("$registry" -eq "mcr.microsoft.com") {

        # public repository - no authorization needed

    } elseif ($registryCredential) {

        $credentials = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($registryCredential.UserName + ":" + [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($registryCredential.Password))))
        $authorization = "Basic $credentials"

    } elseif ("$registry" -eq "bcinsider.azurecr.io" -or "$registry" -eq "bcprivate.azurecr.io") {

        throw "$registry registry requires authorization. Please specify username and password for the registry in registryCredential."

    } else {

        $repository = "$registry/$repository"
        $registry = "registry.hub.docker.com"
        $token = ($webclient.DownloadString("https://auth.docker.io/token?scope=repository:${repository}:pull&service=registry.docker.io") | ConvertFrom-Json).token
        $authorization = "Bearer $token"

    }

    $webclient.Headers.Add('Accept', “application/vnd.docker.distribution.manifest.v1+json”)
    if ($authorization) {
        $webclient.Headers.Add("Authorization", $authorization )
    }

    try {
        (($webclient.DownloadString("https://$registry/v2/$repository/manifests/$tag") | ConvertFrom-Json).history[0].v1Compatibility | ConvertFrom-Json).container_config.Labels
    }
    catch {
    }
}
catch {
    TrackException -telemetryScope $telemetryScope -errorRecord $_
    throw
}
finally {
    TrackTrace -telemetryScope $telemetryScope
}
}
Set-Alias -Name Get-NavContainerImageLabels -Value Get-BcContainerImageLabels
Export-ModuleMember -Function Get-BcContainerImageLabels -Alias Get-NavContainerImageLabels