You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD添加MSSQL服务失败:健康检查及DNS问题求助

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中docker executor的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:01:01