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
相关产品推荐
相关产品推荐

