在 Docker 容器中的 Server Core 2019 上安装 SQL Server LocalDB

Posted

技术标签:

【中文标题】在 Docker 容器中的 Server Core 2019 上安装 SQL Server LocalDB【英文标题】:Install SQL Server LocalDB on Server Core 2019 in Docker container 【发布时间】:2021-03-13 17:49:57 【问题描述】:

在 Docker 容器中(图像 = mcr.microsoft.com/windows/servercore:ltsc2019),我已经下载了 SQL Server Express 2019 安装程序。

我已经成功下载了 LocalDB msi:

SQL2019-SSEI-Expr.exe /Action=Download /MediaType=LocalDB /Quiet

文件下载到:

C:\Users\ContainerAdministrator\Downloads\en-us\SqlLocalDB.msi

但是...运行msiexec 失败,没有任何错误消息。导航到上述路径后,我执行:

msiexec.exe /qb /i .\SqlLocalDB.msi IAcceptSqlLocalDBLicenseTerms=YES

命令在零延迟后立即返回命令行。什么都没有安装。

我错过了什么?

编辑: 我正在尝试使用 LocalDB,因为这最终将成为 Azure Pipelines 构建代理。我们使用 Redgate 的“SqlChangeAutomation”powershell 工具,它使用 LocalDB。

编辑 2: 不过,不确定这是否取得了进展……我在 msiexec 日志记录中搞砸了一段时间,发现我可以使用/a 标志而不是/i 来运行它并让它成功安装。

msiexec.exe /qn /a SqlLocalDB.msi IAcceptSqlServerLicenseTerms=YES /L*V "C:\installers\SQL\install.log"

不幸的是,在导航到 C:\Program Files\Microsoft SQL Server\150\tools\binn 并运行 SqlLocalDB.exe info 时,我得到了这个:

Call to LocalDBFormatMessage failed. Error code returned:
2311389462.
Error in LocalDBFormatMessage! Error code returned:
2311389462.

【问题讨论】:

服务器核心不支持? 我想知道这一点,但我在网上找到了人们正在描述我正在尝试做的确切事情的参考资料。我只是尝试在没有安装任何其他东西的情况下拉出一个干净的 ltsc2019 映像——仍然没有乐趣。 仍然,为什么使用 Server Core 的 LocalDb?基于服务的 SQL Express 更适合。 这将是一个 Azure Pipeline 构建代理,我们对使用 LocalDB 的 Redgate 的“SqlChangeAutomation”powershell 工具有严格的要求 相关:Service 'Sql Server VSS writer' (SQLWriter) failed to start when installing LocalDB 【参考方案1】:

SQL LocalDB 需要 Visual C++ 可再发行组件,否则很多事情都不会正常进行(我的问题是 SqlWriter 服务在安装期间根本不会创建)。

编辑:看来我可以使用 Chocolatey 来安装 vc_redist 和旧版本的 localdb。 (申请将 sqllocaldb 包更新到 2019 年的申请单)这样可以简化大多数人的工作。保留原始参数/命令以防万一。

我的精确参数的 powershell 步骤(假设您收集了所需的文件):

    start-process .\VC_redist.x64.exe -Wait -ArgumentList @('/install','/norestart','/passive') 请注意,我使用的是来自 https://aka.ms/vs/16/release/vc_redist.x64.exe 的 redist,应该是 2019 版,但是一些 cmets 说我应该使用 SQL 安装程序包中的那个,或者一些 2015 版本。然而,这些都没有在容器中为我“工作”,但这可能是我错误地调用它们。除此之外,我需要安装的其他软件包无论如何都需要 2019 年。 start-process msiexec -Wait -ArgumentList @('/i','SqlLocalDB.msi','/qn','/norestart','/L*V','install.log','IACCEPTSQLLOCALDBLICENSETE RMS=YES') 请注意,“/i”而不是“/a”此时可以正常工作,并且“/norestart”选项。这是从choco localdb 命令源中找到的。

有用的 powershell sn-p 来获取一些事件日志(将“系统”更改为“应用程序”),这有助于我解决问题,因为容器中没有事件查看器:get-eventlog -LogName System -After (Get-Date).AddMinutes(-5) | ? -not $_.Source.Contains("DCOM") |?-not $_.Message.Contains("depends on the Background Tasks Infrastructure Service")| Format-List 这并检查“install.log " SqlLocalDB.msi 中的逐行说明最终使我走上了正轨。

【讨论】:

注意,我距离在我的容器中运行任何东西还有几天的时间,但您可能还需要启动 SqlWriter 服务 LocalDB 安装(并且在没有 redist 的情况下启动失败)作为容器入口点的一部分,例如 this over here。 你摇滚!我不得不暂时搁置这个项目,因为我没有更多的时间投入到它上面。在尝试了您的建议后,我成功地重建了图像,并通过了一系列测试,它表现完美。谢谢你!

以上是关于在 Docker 容器中的 Server Core 2019 上安装 SQL Server LocalDB的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Docker 容器能否在 Windows Server core 2022 上运行(“linux”不能在此平台上使用)

ASP.NET Core 5 + SQL Server Docker 容器:无效的撰写项目

Docker 容器里连接远程 Sql Server 数据库。

Windows Server 2019 Core(4)-安装Docker

.net core docker容器编排部署(linux)

使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure