Windows PowerShell to create Docker Containers for SQL2017,SQL2019

Code example that create ten instances: each version of ‘Express’,’Developer’,’Web’,’StandardEdition’,’EnterpriseEdition’

Clear-Host
###################################################################################################
## Create-NewDockerInstances
###################################################################################################
function Create-NewDockerInstance 
{
  param(
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string] $InstanceName,

    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [ValidateSet('Express','Developer','Web','StandardEdition','EnterpriseEdition')]
    [string] $SQLEdition,
        
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [ValidateSet('2017','2019')]
    [string] $SQLVersion,
        
    [string] $DefaultSAPassword = 'MyRealPasswordForTheDemo#312'
  )
  ##################################################################################################
  ## Get the list of containers, so i can decide to either run(create+start), or just start
  ###################################################################################################
  $AllContainers = [System.Collections.ArrayList] @()
  $Results = &"docker.exe" ps -a
  if ($Results.Count -gt 1)
  { 
    for([int] $i = 1;$i -lt $Results.Count;$i++)
    { 
      ## &"docker.exe" ps -a has whitespace that puts us at element 12
      $Rev = $Results[$i][-1..-$Results[$i].Length] -join '' #reverse the string
      $ContainerName = (( $Rev -split '\s+')[0].Trim())[-1..-$Results[$i].Length] -join '' # get the first element of the string and reverse it again
      $AllContainers.Add($ContainerName) | Out-Null
      ##uncomment to delete/cleanup all the old containers#
      #&"docker.exe" rm $ContainerName
    }
  }
        
  ###################################################################################################
  ## Create and run if it does not exist, else start it
  ###################################################################################################
  $ver  = $InstanceName.ToLower()
  $port = switch($SQLEdition) { 'Express' {''} 'Developer' {'1'} 'Web' {'2'} 'StandardEdition' {'3'} 'EnterpriseEdition'{'4'} } 
  $port += $SQLVersion + ':1433'
  $mcr = switch($SQLVersion)  { '2017' {'mcr.microsoft.com/mssql/server:2017-latest'} '2019' {'mcr.microsoft.com/mssql/server:2019-latest'} }
  
  
  if($AllContainers -notcontains $ver)
  #{&"docker.exe" run $ParameterArray -d $mcr }
  {&"docker.exe" run -e "ACCEPT_EULA=Y" -e "$("SA_PASSWORD=$DefaultSAPassword")" -e "$("MSSQL_PID=$SQLEdition")" --name "$("$ver")" -p $($port) -d $($mcr) }
  else {&"docker.exe" start $ver}
  
} # End function
###################################################################################################

function Get-AllDockerInstances([switch] $IncludeAll)
{
  if($IncludeAll) 
  { 
    &"docker.exe" ps  -a               ##running containers
  } else 
  { 
    &"docker.exe" ps                ##running containers
  }
}

###################################################################################################
##  Save-AllRunningDockerInstances
###################################################################################################
function Save-AllRunningDockerInstances()
{
  ###################################################################################################
  ##save all my running docker containers, Keep any changes
  ###################################################################################################

  $Results = &"docker.exe" ps 
  if ($Results.Count -gt 1)
  { 
    for([int] $i = 1;$i -lt $Results.Count;$i++)
    { 
      $Container = $Results[$i].SubString(0,$Results[$i].IndexOf(' ')).Trim()
      $Rev = $Results[$i][-1..-$Results[$i].Length] -join '' #reverse the string
      $ContainerName = (( $Rev -split '\s+')[0].Trim())[-1..-$Results[$i].Length] -join '' # get the first element of the string and reverse it again
      #Write-Host "Saving $ContainerName" -ForegroundColor Gray
      ##docker.exe : Error response from daemon: invalid reference format: repository name must be lowercase
      $ZipFileName = $ContainerName.ToLower() + ".zip"
      &"docker.exe" save ($ContainerName.ToLower()) > $ZipFileName
    }
  }
} 
###################################################################################################

###################################################################################################
## Delete-AllRunningDockerInstances
###################################################################################################
function Delete-AllRunningDockerInstances([switch] $IncludeAll)
{
  if($IncludeAll){$Results = &"docker.exe" ps -a} else{$Results = &"docker.exe" ps }
  if ($Results.Count -gt 1)
  { 
    for([int] $i = 1;$i -lt $Results.Count;$i++) # $i=1
    { 
      $Container = $Results[$i].SubString(0,$Results[$i].IndexOf(' ')).Trim()
      $Rev = $Results[$i][-1..-$Results[$i].Length] -join '' #reverse the string
      $ContainerName = (( $Rev -split '\s+')[0].Trim())[-1..-$Results[$i].Length] -join '' # get the first element of the string and reverse it again
      Write-Host "Stopping  $ContainerName" -ForegroundColor Gray
      &"docker.exe" stop $Container # $ContainerName
      &"docker.exe" rm $Container # $ContainerName
    }
  }
}
###################################################################################################


###################################################################################################
## The Work
###################################################################################################

##Create-NewDockerInstance -InstanceName "Express2017" -SQLEdition "Developer"  -SQLVersion "2017"
#Get-AllDockerInstances
#Get-AllDockerInstances -IncludeAll
#Save-AllRunningDockerInstances
#Delete-AllRunningDockerInstances

#Delete-AllRunningDockerInstances -IncludeAll


    $EditionMatrix = @('Express','Developer','Web','StandardEdition','EnterpriseEdition')
    $VersionMatrix = @('2017','2019')

    foreach($Version in $VersionMatrix)
    {
      foreach($Edition in $EditionMatrix)
      {
        Write-Host "Creating SQL $Version $Edition" -ForegroundColor Green
    
        Create-NewDockerInstance -InstanceName $($Edition.Replace("Edition","") + $Version ) -SQLEdition $Edition  -SQLVersion $Version
      }
    }

Leave a Reply