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

构建预加载Dind镜像时Docker Daemon运行异常求助

解决Docker-in-Docker预加载镜像时的连接问题

问题原因

你遇到的错误是因为docker客户端默认尝试连接tcp://docker:2375,但这个主机名在你的Dind容器内部不存在。实际上你启动的dockerd是监听本地的Unix套接字/var/run/docker.sock,客户端没配置正确的连接路径,导致无法通信。另外固定sleep 30的方式也不可靠,万一dockerd启动慢,还是会连接失败。

解决方案

修改你的download.sh脚本,做两个关键调整:

  1. 强制docker客户端使用本地Unix套接字连接
  2. 替换固定sleep,用轮询等待dockerd完全就绪

修改后的download.sh脚本

#!/bin/bash
set -x

# 启动dockerd后台运行
dockerd &

# 显式指定docker客户端连接到本地Unix套接字
export DOCKER_HOST=unix:///var/run/docker.sock

# 轮询等待docker daemon就绪,替代固定sleep
until docker info >/dev/null 2>&1; do
    echo "等待Docker Daemon启动..."
    sleep 2
done

# 拉取需要预加载的镜像
docker pull alpine:3.18

# 保持容器运行(如果你的CI环境需要这个Dind容器持续提供服务,保留此命令)
wait

无需修改Dockerfile(除非你有其他配置需求)

原Dockerfile可以继续使用,因为我们只调整了脚本逻辑。重新构建并运行:

docker build -t new-dind:t1 -f Dockerfile .
docker run --name new-dind --privileged new-dind:t1

额外说明

  • 如果你不想设置DOCKER_HOST环境变量,也可以在每个docker命令后加上--host unix:///var/run/docker.sock参数,比如docker --host unix:///var/run/docker.sock pull alpine:3.18
  • 用until docker info轮询的方式比固定sleep更健壮,能确保dockerd完全就绪后再执行拉取操作
  • 预加载完成后,你可以提交这个容器为新镜像,后续CI使用时就包含了预拉取的alpine:3.18镜像

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:38:30