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

GitLab CI中Docker-in-docker无法连接Docker守护进程问题

GitLab CI Ubuntu镜像连接Docker Daemon失败的解决办法

问题根源

用ubuntu:20.04作为CI任务镜像时,虽然配置了docker:dind服务,但Docker客户端默认会尝试连接本地的/var/run/docker.sock套接字,而这个套接字在Ubuntu镜像中并未由DinD服务提供,导致连接失败。而docker:latest镜像默认已经配置了指向DinD的环境变量,所以能正常工作,但它基于Alpine系统,缺少Debian/Ubuntu的包管理工具链。

解决方案

1. 配置环境变量指向DinD服务

在CI任务中添加以下环境变量,让Docker客户端连接到docker:dind服务的TCP端口:

test job:
  image: ubuntu:20.04
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://docker:2375  # "docker"是服务名称,对应DinD容器的主机名
    DOCKER_TLS_CERTDIR: ""  # 禁用TLS验证,CI环境下通常无需加密连接
  script:
    - apt -y update
    - apt -y install python3-pip docker-compose
    - until docker info; do sleep 1; done  # 等待DinD服务完全启动
    - ...  # 后续测试脚本

2. 等待DinD服务就绪

DinD服务启动需要短暂时间,添加until docker info; do sleep 1; done可以确保Docker守护进程完全启动后再执行后续命令,避免因服务未就绪导致的连接失败。

3. 自定义镜像(长期方案)

如果需要频繁使用Debian/Ubuntu的软件包,建议构建一个包含Docker客户端和APT工具链的自定义镜像,Dockerfile示例:

# 基于Ubuntu 20.04构建,同时安装Docker客户端和必要工具
FROM ubuntu:20.04
RUN apt update && apt install -y --no-install-recommends \
    docker.io \
    python3-pip \
    docker-compose \
    && rm -rf /var/lib/apt/lists/*

将这个镜像推送到GitLab容器注册表后,CI任务直接使用该镜像,无需每次安装依赖,同时解决Docker连接和包管理的问题。

验证

在脚本开头添加docker info命令,若能输出Docker守护进程的详细信息,说明连接成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:52:16