GitLab CI/CD添加MSSQL服务失败:健康检查及DNS问题求助
问题背景
项目开发中需针对MSSQL Server做单元测试,此前将所有工具(含MSSQL)打包为15GB的Docker镜像,体积过大。改用GitLab CI/CD的Service功能后,自定义MSSQL镜像作为服务时持续触发健康检查失败,同时执行ping mssql无法找到对应DNS条目。
错误信息
*** WARNING: Service runner-hrtjgacu-project-1489-concurrent-0-2ae3f3cd2099f19a-gitlab.mydomain.lcaol__windowsdockerimages__mssql-0 probably didn't start properly.
Health check error:
service "runner-hrtjgacu-project-1489-concurrent-0-2ae3f3cd2099f19a-gitlab.mydomain.local__windowsdockerimages__mssql-0-wait-for-service" health check: exit code 1
Health check container logs:
2023-01-19T09:58:09.913696500Z FATAL: No HOST or PORT found
Service container logs:
相关配置文件
自定义MSSQL Dockerfile
FROM mcr.microsoft.com/windows/servercore:ltsc2019 # Download Links: ENV exe "https://go.microsoft.com/fwlink/?linkid=840945" ENV box "https://go.microsoft.com/fwlink/?linkid=840944" ENV sa_password="_" \ attach_dbs="[]" \ ACCEPT_EULA="Y" \ sa_password_path="C:\ProgramData\Docker\secrets\sa-password" SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] # make install files accessible COPY start.ps1 / WORKDIR / RUN Invoke-WebRequest -Uri $env:box -OutFile SQL.box ; \ Invoke-WebRequest -Uri $env:exe -OutFile SQL.exe ; \ Start-Process -Wait -FilePath .\SQL.exe -ArgumentList /qs, /x:setup ; \ .\setup\setup.exe /q /ACTION=Install /INSTANCENAME=MSSQLSERVER /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT='NT AUTHORITY\System' /SQLSYSADMINACCOUNTS='BUILTIN\ADMINISTRATORS' /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS ; \ Remove-Item -Recurse -Force SQL.exe, SQL.box, setup RUN stop-service MSSQLSERVER ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.MSSQLSERVER\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.MSSQLSERVER\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.MSSQLSERVER\mssqlserver\' -name LoginMode -value 2 ; HEALTHCHECK CMD [ "sqlcmd", "-Q", "select 1" ] EXPOSE 1433/tcp EXPOSE 4022/tcp EXPOSE 135/tcp EXPOSE 1434/tcp EXPOSE 1434/udp CMD .\start -sa_password $env:sa_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs \"$env:attach_dbs\" -Verbose
.gitlab-ci.yml配置
default: image: name: gitlab.mydomain.local:4567/windowsdockerimages/basicnetframeworkimage:latest tags: - windows - docker # The stages during this build stages: - build build: stage: build script: - echo "Hello world" - ping mssql - dotnet run services: - name: gitlab.mydomain.local:4567/windowsdockerimages/mssql alias: mssql
解决方案排查与修复
1. 修复健康检查逻辑
当前HEALTHCHECK命令未指定连接参数,sqlcmd默认尝试无认证连接本地实例,容器启动初期实例未就绪且缺少SA密码导致失败。修改为带明确认证的检查命令:
HEALTHCHECK --interval=10s --timeout=3s --retries=5 \ CMD sqlcmd -S localhost,1433 -U sa -P "$env:sa_password" -Q "select 1" || exit 1
2. 解决DNS解析问题
Windows容器服务的DNS别名生效依赖服务容器完成健康检查,需:
- 确保GitLab Runner的
config.toml中dockerexecutor的network_mode设置为nat(Windows默认网络); - 在
.gitlab-ci.yml中显式指定服务端口映射,帮助GitLab CI识别服务端口:
services: - name: gitlab.mydomain.local:4567/windowsdockerimages/mssql alias: mssql ports: - "1433:1433"
3. 添加服务就绪等待
MSSQL在Windows容器中启动较慢,在.gitlab-ci.yml的script中添加等待逻辑,确保服务就绪后再执行测试:
# 等待MSSQL服务就绪 $retries = 0 $maxRetries = 30 while ($retries -lt $maxRetries) { try { sqlcmd -S mssql,1433 -U sa -P "YourSAPassword" -Q "select 1" Write-Host "MSSQL is ready" break } catch { Write-Host "Waiting for MSSQL..." Start-Sleep -Seconds 5 $retries++ } }
4. 镜像体积优化(可选)
替换自定义镜像为微软官方MSSQL Windows容器镜像mcr.microsoft.com/mssql/server:2019-latest-windows,官方镜像已优化启动逻辑与健康检查,大幅降低体积。
内容的提问来源于stack exchange,提问作者Foitn

