microsoft / navcontainerhelper

Official Microsoft repository for BcContainerHelper, a PowerShell module, which makes it easier to work with Business Central Containers on Docker.
MIT License
376 stars 243 forks source link

License error when creating a Docker instance using SQL on the host. #3189

Open acardenaskma opened 11 months ago

acardenaskma commented 11 months ago

PLEASE DO NOT INCLUDE ANY PASSWORDS OR TOKENS IN YOUR ISSUE!!!

Describe the issue When creating a Docker instance using SQL on the host, the script fails when trying to create the user.

Scripts used to create the container and cause the issue

$Username = 'bcUserHere'
$Password = 'bcPasswordHere'
$credential = New-Object pscredential $Username, (ConvertTo-SecureString -String $Password -AsPlainText -Force)

$PortBase = 7800
$Ports = @{
    WebClientPort = 8787
    FileSharePort = $PortBase + 42
    ManagementServicesPort = $PortBase + 45
    ClientServicesPort = $PortBase + 46
    SoapServicesPort = $PortBase + 47
    ODataServicesPort = $PortBase + 48
    DeveloperServicesPort = $PortBase + 49
}
$Ports += @{ PublishPorts = $Ports.Values } 

$sasToken = "custom token here"
$ContainerName = "BC-NexMajor-HostSql"
$artifactUrl = Get-BCArtifactUrl -country us -select NextMajor -sasToken $sasToken

$dbUser = 'sqlUserHere'
$dbPassword = 'sqlPasswordHere'
$databaseParams = @{
    "databaseServer" = 'host.containerhelper.internal'
    "databaseInstance" = ''
    "databasePrefix" = "$ContainerName-"
    "databaseName" = 'CRONUS'
    "databaseCredential" = New-Object pscredential $dbUser, (ConvertTo-SecureString -String $dbPassword -AsPlainText -Force)
    "multitenant" = $false
}

New-BcContainer @databaseParams -replaceExternalDatabases `
    -accept_eula `
    -containerName $ContainerName  `
    -artifactUrl $artifactUrl `
    -updateHosts `
    -auth UserPassword `
    -Credential $credential `
    @Ports `
    -memoryLimit 8g

Full output of scripts

BcContainerHelper is version 5.0.4
BcContainerHelper is running as administrator
HyperV is Enabled
UsePsSession is True
Host is Microsoft Windows 11 Enterprise - 10.0.22621.2134
Docker Client Version is 24.0.2
Docker Server Version is 24.0.2
Removing Desktop shortcuts
Starting Database Restore job from https://bcinsider.azureedge.net/sandbox/23.0.12083.0/us
C:\Program Files\WindowsPowerShell\Modules\BcContainerHelper\5.0.4\Import-BcContainerHelper.ps1
Fetching all docker images
Fetching all docker volumes
Using image mcr.microsoft.com/businesscentral:10.0.20348.1906
Publishing port 7846
Publishing port 7847
Publishing port 7848
Publishing port 8787
Publishing port 7842
Publishing port 7845
Publishing port 7849
Creating Container BC-HostSql-US
Style: sandbox
Multitenant: No
Version: 23.0.12083.0
Platform: 23.0.12068.0
Generic Tag: 1.0.2.14
Container OS Version: 10.0.20348.1906 (ltsc2022)
Host OS Version: 10.0.22621.2134 (22H2)
Using hyperv isolation
Using locale en-US
Disabling the standard eventlog dump to container log every 2 seconds (use -dumpEventLog to enable)
Files in C:\ProgramData\BcContainerHelper\Extensions\BC-HostSql-US\my:
- AdditionalOutput.ps1
- MainLoop.ps1
- SetupDatabase.ps1
- SetupVariables.ps1
- updatehosts.ps1
Creating container BC-HostSql-US from image mcr.microsoft.com/businesscentral:10.0.20348.1906
Using Shared Encryption Key file
dc9ccd26256085a677ece2d7668187991494aab06225bcc90f02d152a2e9a07e
Waiting for container BC-HostSql-US to be ready
Using artifactUrl https://bcinsider.azureedge.net/sandbox/23.0.12083.0/us
Using installer from C:\Run\210-new
Installing Business Central
Installing from artifacts
Starting Local SQL Server
Starting Internet Information Server
Copying Service Tier Files
c:\dl\sandbox\23.0.12083.0\platform\ServiceTier\Program Files
c:\dl\sandbox\23.0.12083.0\platform\ServiceTier\System64Folder
Copying PowerShell Scripts
c:\dl\sandbox\23.0.12083.0\platform\WindowsPowerShellScripts\Cloud\NAVAdministration
c:\dl\sandbox\23.0.12083.0\platform\WindowsPowerShellScripts\WebSearch
Copying Web Client Files
c:\dl\sandbox\23.0.12083.0\platform\WebClient\Microsoft Dynamics NAV
Copying ModernDev Files
c:\dl\sandbox\23.0.12083.0\platform
c:\dl\sandbox\23.0.12083.0\platform\ModernDev\program files\Microsoft Dynamics NAV
Copying additional files
Copying ConfigurationPackages
C:\dl\sandbox\23.0.12083.0\us\ConfigurationPackages
Copying Test Assemblies
C:\dl\sandbox\23.0.12083.0\platform\Test Assemblies
Copying Extensions
C:\dl\sandbox\23.0.12083.0\us\Extensions
Copying Applications
C:\dl\sandbox\23.0.12083.0\platform\Applications
Copying Applications.US
C:\dl\sandbox\23.0.12083.0\us\Applications.US
Copying dependencies
Copying ReportBuilder
Importing PowerShell Modules
Skipping restore of Cronus database
Modifying Business Central Service Tier Config File for Docker
Creating Business Central Service Tier
Installing SIP crypto provider: 'C:\Windows\System32\NavSip.dll'
Installation took 17 seconds
Installation complete
Initializing...
Setting host.docker.internal to 192.168.1.40 in container hosts file (copy from host hosts file)
Setting gateway.docker.internal to 192.168.1.40 in container hosts file (copy from host hosts file)
Setting kubernetes.docker.internal to 127.0.0.1 in container hosts file (copy from host hosts file)
Setting host.containerhelper.internal to 172.19.112.1 in container hosts file
Starting Container
Hostname is BC-HostSql-US
PublicDnsName is BC-HostSql-US
Using NavUserPassword Authentication
Success
Import Encryption Key
Stopping local SQL Server
Creating Self Signed Certificate
Self Signed Certificate Thumbprint 3C7A0AF3EFD965BA8305DFBF83F8816FCBBC5244
DNS identity BC-HostSql-US
Modifying Service Tier Config File with Instance Specific Settings
Starting Service Tier
Registering event sources
Creating DotNetCore Web Server Instance
Using application pool name: BC
Using default container name: NavWebApplicationContainer
Copy files to WWW root C:\inetpub\wwwroot\BC
Create the application pool BC
Create website: NavWebApplicationContainer without SSL
Update configuration: navsettings.json
Done Configuring Web Client
Enabling Financials User Experience
Creating http download site
Container IP Address: 172.19.123.124
Container Hostname  : BC-HostSql-US
Container Dns Name  : BC-HostSql-US
Web Client          : http://BC-HostSql-US:8787/BC/
Dev. Server         : http://BC-HostSql-US
Dev. ServerInstance : BC
Setting BC-HostSql-US to 172.19.123.124 in host hosts file

Files:
http://BC-HostSql-US:7842/ALLanguage.vsix

Container Total Physical Memory is 4.5Gb
Container Free Physical Memory is 1.7Gb

Initialization took 83 seconds
Ready for connections!
Reading CustomSettings.config from BC-HostSql-US
Creating Desktop Shortcuts for BC-HostSql-US
Cleanup old dotnet core assemblies
Creating User bcUserHere
An error occurred while reading the license file. Verify the license file is in the correct BCLicense file format and try again. Error Code: Unknown error.

Exception Script Stack Trace:
at <ScriptBlock>, <No file>: line 61

PowerShell Call Stack:
at Invoke-ScriptInBcContainer, C:\Program Files\WindowsPowerShell\Modules\BcContainerHelper\5.0.4\ContainerHandling\Invoke-ScriptInNavContainer.ps1: line 71
at New-BcContainerBcUser, C:\Program Files\WindowsPowerShell\Modules\BcContainerHelper\5.0.4\UserHandling\New-NavContainerNavUser.ps1: line 60
at New-BcContainer, C:\Program Files\WindowsPowerShell\Modules\BcContainerHelper\5.0.4\ContainerHandling\New-NavContainer.ps1: line 2404
at <ScriptBlock>, C:\Docker\BCGenericExternalSQL.ps1: line 82

Container Free Physical Memory: 1.6Gb

Services in container BC-HostSql-US:
- MicrosoftDynamicsNavServer$BC is Running
- MSSQL$SQLEXPRESS is Stopped

Relevant event log from container BC-HostSql-US:
- 20230920 12:19:09 - MicrosoftDynamicsNavServer$BC

  Type: Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReaderException
  Message: Unexpected end of license stream
  Source: Microsoft.Dynamics.BusinessCentral.Bcl
  HResult: -2146233088
  StackTrace:
       at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader.Decode(Stream licenseData)
       at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader..ctor(Stream licenseData)
       at Microsoft.Dynamics.BusinessCentral.License.BclLicenseDataReader..ctor(Byte[] data)
       at Microsoft.Dynamics.Nav.Runtime.NavLicense.Create(Byte[] license, LicenseExpiredHandler licenseExpiredHandler, Func`2 universalCodeEnabledHandler)
  StackTrace:
       at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader.Decode(Stream licenseData)
       at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader..ctor(Stream licenseData)
       at Microsoft.Dynamics.BusinessCentral.License.BclLicenseDataReader..ctor(Byte[] data)
       at Microsoft.Dynamics.Nav.Runtime.NavLicense.Create(Byte[] license, LicenseExpiredHandler licenseExpiredHandler, Func`2 universalCodeEnabledHandler)

- 20230920 12:19:09 - MicrosoftDynamicsNavServer$BC

  Server instance: BC
  Category: License
  ClientSessionId: 00000000-0000-0000-0000-000000000000
  ClientActivityId: 00000000-0000-0000-0000-000000000000
  ServerSessionUniqueId: f24b506d-b445-47bb-bacb-7b6762cd60eb
  ServerActivityId: 19beff7d-19f4-47c0-a7ca-035087dcaa36
  EventTime: 09/20/2023 16:19:09
  Message (LicenseReaderException): RootException: LicenseReaderException
  ExceptionStackTrace:
     at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader.Decode(Stream licenseData)
     at Microsoft.Dynamics.BusinessCentral.License.BcLicense.LicenseReader..ctor(Stream licenseData)
     at Microsoft.Dynamics.BusinessCentral.License.BclLicenseDataReader..ctor(Byte[] data)
     at Microsoft.Dynamics.Nav.Runtime.NavLicense.Create(Byte[] license, LicenseExpiredHandler licenseExpiredHandler, Func`2 universalCodeEnabledHandler)
  CallerStackTrace:
     at Microsoft.Dynamics.Nav.Runtime.NavLicense.Create(Byte[] license, LicenseExpiredHandler licenseExpiredHandler, Func`2 universalCodeEnabledHandler)
     at Microsoft.Dynamics.Nav.Runtime.NavLicense.Create(Byte[] license, LicenseExpiredHandler licenseExpiredHandler)
     at Microsoft.Dynamics.Nav.Runtime.NavDatabaseSecurityAndLicense.get_License()
     at Microsoft.Dynamics.Nav.Runtime.NavSession.get_License()
     at Microsoft.Dynamics.Nav.Runtime.NavSession.ValidateLicense()
     at Microsoft.Dynamics.Nav.Runtime.NavSession.Open(Boolean useUserPersonalization, Byte[] licenseToUse, Boolean allowAppsDisabledMode)
     at Microsoft.Dynamics.Nav.Service.NSAdminService.Microsoft.BusinessCentral.AdminApi.IAdminService.OpenAdminConnection(ConnectionRequest connectionRequest)
     at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
     at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
     at CoreWCF.Dispatcher.InvokerUtil.CriticalHelper.<>c__DisplayClass3_0.<GenerateInvokeDelegate>b__0(Object target, Object[] inputs, Object[] outputs)
     at CoreWCF.Dispatcher.SyncMethodInvoker.InvokeAsync(Object instance, Object[] inputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass5_0.<Create>b__0(ServiceOperationContext context)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.AddToThreadSchedulerCombinator(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.ErrorMappingCombinator(ServiceOperationContext context, ServiceOperation innerOperation, Boolean useCoreWcfFaultException)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass1_0.<Create>b__0(ServiceOperationContext context, ServiceOperation operation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.PartnerTelemetryPermissionErrorCombinator(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.PushPopCombinator(ServiceOperationContext context, ServiceOperation innerOperation, Boolean useCoreWcfFaultException)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass1_0.<Create>b__2(ServiceOperationContext context, ServiceOperation operation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.CreateNewSessionCombinator(ServiceOperationContext context, ServiceOperation innerOperation, Boolean requireNavUser, Boolean useC
oreWcfFaultException)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.CreateNewAdminSessionCombinator(ServiceOperationContext context, ServiceOperation innerOperation, Boolean useCoreWcfFaultExceptio
n)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass1_0.<Create>b__5(ServiceOperationContext context, ServiceOperation operation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationTracer.TraceScopeCombinator(Category telemetryCategory, ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass1_0.<Create>b__8(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass7_0.<PerformanceCounterCombinator>b__0()
     at Microsoft.Dynamics.Nav.Runtime.NavPerformanceCounterSetter.UpdatePerformanceCountersWithAverageServiceOperationAction(Action action, NavSession session)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.PerformanceCounterCombinator(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.InitClientTelemetryIdsCombinator(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.TlsClearCombinator(ServiceOperationContext context, ServiceOperation innerOperation)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationPipeline.<>c__DisplayClass25_0.<Combine>b__1(ServiceOperationContext contexts)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.InvokeAsync(Object instance, Object[] inputs)
     at CoreWCF.Dispatcher.DispatchOperationRuntime.<>c__DisplayClass68_0.<<InvokeAsync>b__0>d.MoveNext()
     at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
     at CoreWCF.Dispatcher.DispatchOperationRuntime.<>c__DisplayClass68_0.<InvokeAsync>b__0()
     at CoreWCF.Dispatcher.SecurityImpersonationBehavior.RunImpersonated[T](MessageRpc rpc, Func`1 func)
     at CoreWCF.Dispatcher.DispatchOperationRuntime.InvokeAsync(MessageRpc rpc)
     at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
     at CoreWCF.Dispatcher.DispatchOperationRuntime.InvokeAsync(MessageRpc rpc)
     at CoreWCF.Dispatcher.ImmutableDispatchRuntime.ProcessMessageAsync(MessageRpc rpc)
     at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)
     at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
     at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
     at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecuteFromThreadPool(Thread threadPoolThread)
     at System.Threading.ThreadPoolWorkQueue.Dispatch()
     at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()
     at System.Threading.Thread.StartCallback()

  ProcessId: 2476
  Tag: 0000EX6
  ThreadId: 10
  CounterInformation: 
  CustomParameters: {
  }
  GatewayCorrelationId: 

New-BcContainer Telemetry Correlation Id: 7a488f8e-1d61-4727-aedb-86e662658d77
An error occurred while reading the license file. Verify the license file is in the correct BCLicense file format and try again. Error Code: Unknown error.
At C:\Program Files\WindowsPowerShell\Modules\BcContainerHelper\5.0.4\ContainerHandling\Invoke-ScriptInNavContainer.ps1:112 char:13
+             throw $errorMessage
+             ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (An error occurr... Unknown error.:String) [], RuntimeException
    + FullyQualifiedErrorId : An error occurred while reading the license file. Verify the license file is in the correct BCLicense file format and try again. Error Code: Unknown error.
...

Additional context As a workaround, I have to manually import a dev or a demo license, and add a BC user after the error.

fmenke commented 9 months ago

I can confirm this issue. I worked around it by copying the cronus license file from bcartifacts to another location, and using this license within the script, which then runs without any issues.