Windows Dockerfile安装SQL Server 2019 CU27后版本未更新问题
排查步骤与解决方法
确认补丁安装的目标实例
Windows容器中SQL Server开发者版默认实例为MSSQLSERVER,补丁安装时必须指定实例名才能确保补丁打到正确服务。检查你的Dockerfile中补丁安装命令是否包含/INSTANCENAME=MSSQLSERVER参数,正确命令示例:SQLServer2019-KB5029086-x64.exe /quiet /IAcceptSQLServerLicenseTerms /INSTANCENAME=MSSQLSERVER查看补丁安装日志,搜索
Instance Name字段,确认安装目标是MSSQLSERVER。强制重启SQL Server服务
CU补丁安装完成后必须重启SQL服务才能生效,Docker构建过程中不会自动触发重启。在Dockerfile的补丁安装步骤后添加重启命令:RUN net stop MSSQLSERVER && net start MSSQLSERVER注意:确保容器内
sa密码环境变量MSSQL_SA_PASSWORD已正确设置,避免重启后服务无法启动。验证版本查询的准确性
执行完整的sqlcmd命令确认查询的是本地默认实例:sqlcmd -S . -U sa -P ${MSSQL_SA_PASSWORD} -Q "SELECT @@VERSION; SELECT SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('ProductUpdateLevel');"若
ProductUpdateLevel返回NULL说明补丁未生效,返回CU27则补丁已成功应用。避免Docker构建缓存干扰
Docker会缓存已执行的构建层,若之前的RTM安装层被复用,补丁可能未实际执行。构建镜像时添加--no-cache参数强制重新构建所有层:docker build --no-cache -t sql2019-cu27 .或在Dockerfile中修改补丁文件的复制方式,确保每次构建都触发安装步骤:
ADD --chmod=755 ./SQLServer2019-KB5029086-x64.exe /temp/ RUN /temp/SQLServer2019-KB5029086-x64.exe /quiet /IAcceptSQLServerLicenseTerms /INSTANCENAME=MSSQLSERVER检查补丁安装日志细节
不要仅依赖最终的Passed结果,查看日志中是否有Patch installation completed successfully for instance 'MSSQLSERVER'的明确提示。日志默认路径为C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log\<日期文件夹>\Summary.txt,可在Dockerfile中添加复制日志的步骤以便后续排查:COPY "C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log" /sql-patch-logs/
内容的提问来源于stack exchange,提问作者mark

