Introduction
If you're using Docker containers for development and have tried to restore a database that's compatible with SQL Server version 16, you've likely encountered an issue. There have been discussions about this problem, and there are several approaches to solve it. One approach is using SQL Server on the host, while the other is upgrading SQL Server in the container. I prefer the second method, and in this post, I'll outline what needs to be done. This article will provide a more detailed guide on how to implement this approach.
So, Let's try this then
Power shell script
# Helper functions
Set-ExecutionPolicy unrestricted -Force
Function Get-FileName($DialogTitle)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.Title = $DialogTitle
$OpenFileDialog.InitialDirectory = 'C:\'
$OpenFileDialog.Filter = 'All files (*.*)| *.*'
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.FileName
}
Function Get-Folder($initialDirectory)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null
$foldername = New-Object System.Windows.Forms.FolderBrowserDialog
$foldername.Description = "Select a bak file download folder"
$foldername.rootfolder = "MyComputer"
if($foldername.ShowDialog() -eq "OK")
{
$folder += $foldername.SelectedPath
}
return $folder
}
#run this only
# Container main parameters
$ContainerName = Read-Host 'Enter container name'
$LicenseFile = Get-FileName('Select license file')
$AdditionalParameters = @()
if ($(Read-Host 'Restore from bak file (y or n)') -eq 'y')
{
$DatabaseName = Read-Host 'Enter database name'
$connection_string = 'your connection string'
$container_name = 'backup'
$subscription = 'your subscription'
$destination_path = Get-Folder
Connect-AzAccount -Subscription $subscription
Set-AzContext -Subscription $subscription
$storage_account = New-AzStorageContext -ConnectionString $connection_string
$blob = Get-AzStorageBlob -Container $container_name -Context $storage_account | Where-Object { $_.Name -like $DatabaseName +'*.bak' } | Sort-Object LastModified -Descending | Select-Object -First 1 Name,LastModified
New-Item -ItemType Directory -Force -Path $destination_path
Get-AzStorageBlobContent -Container $container_name -Blob $blob.Name -Destination $destination_path -Context $storage_account
$BackupFile = $destination_path + '\' + $blob.Name
$BackupFileName = Split-Path $BackupFile -Leaf
$BackupFilePath = Split-Path $BackupFile -Parent
$ContainerBackupPath = "C:\Backup"
$AdditionalParameters += '--volume {0}:{1}' -f $BackupFilePath, $ContainerBackupPath
}
$artifactUrl = Get-BCArtifactUrl -storageAccount bcartifacts -country w1 -select Closest OnPrem 22.0.54157.55195
# Fill parameters and run New-NavContainer
$Params = @{}
#$Params += @{ accept_eula = $true }
$Params += @{ artifactUrl = $artifactUrl }
$Params += @{ containerName = $ContainerName }
$Params += @{ licenseFile = $LicenseFile }
#$Params += @{ auth = 'NavUserPassword' }
#$Params += @{ credential = $Credential }
#$Params += @{ isolation = 'process' }
#$Params += @{ isolation = 'hyperv' }
#$Params += @{ memoryLimit = '4G' }
#$Params += @{ updateHosts = $true }
$Params += @{ accept_outdated = $true }
$Params += @{ useBestContainerOS = $true }
$Params += @{ additionalParameters = $AdditionalParameters }
New-BcContainer @Params -shortcuts None
#run this only
#run this only
Enter-BcContainer -containerName $ContainerName
#run this only
#run this only
cd C:\dl\SQLServer2022-x64-ENU-Dev\
.\setup.exe /q /ACTION=Upgrade /IACCEPTSQLSERVERLICENSETERMS /INSTANCENAME=SQLEXPRESS /INDICATEPROGRESS
$env:PSModulePath = $env:PSModulePath+';C:\Program Files (x86)\Microsoft SQL Server\160\Tools\PowerShell\Modules\'
#run this only
#run this only
exit
#run this only
#run this only
Restore-DatabasesInBcContainer -containerName $ContainerName -bakFile $BackupFile -databaseName CRONUS
if ($(Read-Host 'Import fonts? (y or n)') -eq 'y')
{
Add-FontsToNavContainer -containername $ContainerName
Restart-NavContainer -containerName $ContainerName
}
#run this only
Script should download bak file and create clean container
When the container is created, you need to execute the following commands
This last one will take a few minutes.
And finally, the container is ready.
Conclusion
If you are experiencing issues with creating a BC container with SQL 2022, this script could be helpful.
Add comment
Comments