构建预加载Dind镜像时Docker Daemon运行异常求助
解决Docker-in-Docker预加载镜像时的连接问题
问题原因
你遇到的错误是因为docker客户端默认尝试连接tcp://docker:2375,但这个主机名在你的Dind容器内部不存在。实际上你启动的dockerd是监听本地的Unix套接字/var/run/docker.sock,客户端没配置正确的连接路径,导致无法通信。另外固定sleep 30的方式也不可靠,万一dockerd启动慢,还是会连接失败。
解决方案
修改你的download.sh脚本,做两个关键调整:
- 强制docker客户端使用本地Unix套接字连接
- 替换固定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
相关产品推荐
相关产品推荐

