“价值不能为空。 参数名称:userName“在Docker中安装MSSQL 2014 Express时出错

当我尝试在Dockerfile中安装MSSQL 2014 Express时,它失败,错误“值不能为空。参数名称:userName”。

The following error occurred: Value cannot be null. Parameter name: userName Error result: -2147467261 Result facility code: 0 Result error code: 16387 Please review the summary.txt log for further details Microsoft (R) SQL Server 2014 12.00.5000.00 Copyright (c) Microsoft Corporation. All rights reserved. The command 'powershell -Command $ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; cd extracted; ./setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS' returned a non-zero code: 1 

这是我的Dockerfile的样子(省略不相关的部分):

 FROM microsoft/windowsservercore SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] COPY SQLEXPR_x64_ENU.exe ./ RUN .\SQLEXPR_x64_ENU.exe /x:extracted /u RUN cd extracted; ./setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS 

奇怪的是,当我用ENTRYPOINT powershellreplace最后一个RUN命令时,启动容器,然后运行完全相同的命令,它的工作原理和错误不会被抛出。

我怀疑是唯一的问题是docker运行命令为“无用户”。 但…

这是运行容器中的whoami命令的结果: user manager\containeradministrator

我已经尝试将RUN whoami到Dockerfile来确认我的假设,但输出是相同的。

我不知道还有什么要做,所以谢谢你的任何build议:)。

Microsoft用于维护SQL Server 2014图像。 你可以在Git历史logging中find它们: https : //github.com/Microsoft/sql-server-samples/tree/cc2402f91e37ce9ad7e108f3f51bbfe99f201e0b/samples/manage/windows-containers/mssql-server-2014-express-windows

 ENV sql_express_download_url "https://download.microsoft.com/download/1/5/6/156992E6-F7C7-4E55-833D-249BD2348138/ENU/x64/SQLEXPR_x64_ENU.exe" ENV sa_password _ ENV attach_dbs "[]" # make install files accessible COPY . / WORKDIR / # download and install Microsoft SQL 2014 Express Edition in one step RUN powershell -Command (New-Object System.Net.WebClient).DownloadFile('%sql_express_download_url%', 'sqlexpress.exe') && /sqlexpress.exe /qs /x:setup && /setup/setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS && del /F /Q sqlexpress.exe && rd /q /s setup RUN powershell -Command \ set-strictmode -version latest ; \ stop-service MSSQL`$SQLEXPRESS ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\' -name LoginMode -value 2 ; CMD powershell ./start -sa_password %sa_password% -attach_dbs \"%attach_dbs%\" -Verbose 

所以我终于find了导致问题的原因。 当使用powershell作为默认shell( SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

我通过跳过SHELL命令并从默认命令行运行安装来实现它。

 RUN /SQLEXPR_x64_ENU.exe /qs /x:setup RUN /setup/setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS 

MSSQL 2008,2012和2016都可以使用PowerShell,只有2014年有这个问题。