如何在指定基础镜像中配置Docker-in-Docker(DinD)构建CI代理镜像?
在自定义基础镜像中配置DinD并解决容器仍创建在外部的问题
一、自定义基础镜像配置DinD的核心步骤
要在公司指定的基础镜像(基于CentOS/使用microdnf)中搭建DinD环境,需完成以下配置:
1. 安装完整的Docker组件
除docker-ce外,还需安装守护进程依赖的docker-ce-cli和containerd.io,确保内部能运行完整的Docker环境:
# 安装yum-config-manager依赖 RUN microdnf -y update \ && microdnf --setopt=tsflags=nodocs install -y yum-utils \ && microdnf clean all \ && rm -rf /var/cache/yum # 添加Docker源并安装全套Docker组件 RUN yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo \ && microdnf -y update \ && microdnf --setopt=tsflags=nodocs install -y docker-ce docker-ce-cli containerd.io \ && microdnf clean all \ && rm -rf /var/cache/yum # 创建Docker守护进程存储目录 RUN mkdir -p /var/lib/docker
2. 配置DinD启动逻辑
需要先启动内部的dockerd,再执行CI任务,可通过自定义启动脚本实现:
# 复制启动脚本到镜像内 COPY start-dind.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start-dind.sh ENTRYPOINT ["/usr/local/bin/start-dind.sh"]
start-dind.sh脚本内容:
#!/bin/bash # 启动内部Docker守护进程 dockerd & # 等待守护进程初始化完成 sleep 5 # 执行后续CI任务 exec "$@"
3. 运行DinD容器的必要参数
启动容器时必须开启特权模式,并挂载tmpfs优化性能,否则内部Docker守护进程无法正常运行:
docker run -d --privileged --tmpfs /var/lib/docker your-custom-dind-image:latest
二、容器仍创建在外部的原因及解决办法
你执行docker build和docker run后容器仍在外部创建,核心原因是当前环境的DOCKER_HOST变量指向了宿主机的Docker守护进程,导致命令被转发到外部。解决方式如下:
1. 强制指定连接内部Docker守护进程
在CI脚本开头添加环境变量设置,确保所有Docker命令指向内部的DinD:
export DOCKER_HOST=unix:///var/run/docker.sock
2. 确认内部Docker守护进程已正常启动
执行Docker命令前,先检查内部守护状态:
docker info
如果返回错误,说明dockerd未启动成功,可延长启动脚本中的等待时间(如将sleep 5改为sleep 10),或直接查看dockerd输出排查问题:
dockerd --debug # 直接启动并查看调试日志
3. 避免宿主机Docker环境变量泄露
若CI环境继承了宿主机的DOCKER_HOST、DOCKER_CERT_PATH等变量,会覆盖内部配置。启动DinD容器时可直接清空或重置这些变量:
docker run -d --privileged --tmpfs /var/lib/docker -e DOCKER_HOST=unix:///var/run/docker.sock your-custom-dind-image:latest
内容的提问来源于stack exchange,提问作者Radboud
相关产品推荐
相关产品推荐

