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

GitLab CI Docker执行器Runner的Docker DinD服务健康检查失败

解决GitLab CI Runner中Docker DinD服务健康检查失败问题

核心解决方案

1. 修复Runner配置的冲突

你的Runner配置中同时挂载了宿主的/var/run/docker.sock,这会导致Job直接使用宿主Docker环境,干扰DinD服务的网络解析。需要移除该挂载:

session_timeout = 1800

[[runners]]
  name = "dev-chat-ci-runner"
  url = "url"
  id = 17
  token = "token"
  token_obtained_at = 2025-04-01T04:51:02Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:28.0.4"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/certs/client", "/cache"]  # 移除/var/run/docker.sock挂载
    shm_size = 0
    network_mtu = 0
    pull_policy = 'if-not-present'

2. 完善DinD服务的环境变量与启动配置

更新chat-kit.gitlab-ci.yml,添加必要配置确保DinD服务正常启动,并替换不可靠的健康检查逻辑:

stages:
  - test

image: docker:28.0.4
services:
  - name: docker:28.0.4-dind
    command: ["--storage-driver=overlay2"]  # 指定存储驱动,避免权限异常

variables:
  DOCKER_TLS_CERTDIR: ""
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2  # 与DinD服务的存储驱动保持一致
  DIND_DISABLE_CLEANUP: "true"  # 禁用自动清理,避免启动失败

cache:
  paths:
    - .cache/pip

before_script:
  # 等待DinD服务完全就绪,替代默认的wait-for-it健康检查
  - until docker info; do sleep 3; done
  - wget https://github.com/milvus-io/milvus/releases/download/v2.0.2/milvus-standalone-docker-compose.yml -O docker-compose.yml
  - docker compose up -d
  - cd chat-kit
  - python --version ; pip --version  # 调试用

pytest:
  stage: test
  script:
    - echo "test"

3. 解决DinD启动权限限制

从DinD的错误日志看,存在挂载权限问题,可通过以下方式处理:

  • 在Runner配置中添加安全选项,解除AppArmor限制:
[runners.docker]
    # 其他配置...
    security_opt = ["apparmor:unconfined"]
  • 测试环境可临时关闭宿主的AppArmor服务:sudo systemctl stop apparmor(生产环境谨慎操作)

问题根源分析

  1. Docker环境冲突:同时挂载宿主docker.sock和使用DinD服务,导致Job优先使用宿主Docker,干扰了DinD服务的DNS解析,出现lookup docker on 127.0.0.11:53: server misbehaving错误。
  2. DinD启动不完整:缺少存储驱动配置,加上宿主安全模块(如AppArmor)的限制,导致DinD服务无法完成初始化,健康检查时无法解析docker主机名。
  3. 健康检查时机错误:默认的wait-for-it脚本在DinD服务未完全启动时就发起检查,导致nc: bad address 'docker'报错,改用循环等待docker info成功的逻辑更可靠。

内容的提问来源于stack exchange,提问作者probaku1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:14:57