为什么Docker daemon在构建dind镜像时无法运行

6rqinv9w  于 2023-10-16  发布在  Docker
关注(0)|答案(1)|浏览(164)

我想做一个预加载的dind镜像(命名为new-dind),这样当CI使用new-dind做一些测试时,就不需要下载镜像了。
这是我的计划

  • 写一个脚本来拉图像
  • 使用此脚本作为入口点

这是我的剧本

#!/bin/bash
set -x
dockerd &
sleep 30
docker pull alpine:3.18

这是我的Dockerfile

FROM docker:24.0.2-dind-alpine3.18

WORKDIR /app

RUN apk update && apk add --no-cache bash curl git

COPY daemon.json /etc/docker/daemon.json
COPY download.sh /app

RUN chmod +x download.sh
CMD ["/app/download.sh"]

当我使用这个命令来构建和运行

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

它显示

+ dockerd
......
time="2023-10-08T09:45:42.958761499Z" level=info msg="Docker daemon" commit=659604f graphdriver=overlay2 version=24.0.2
time="2023-10-08T09:45:42.959336409Z" level=info msg="Daemon has completed initialization"
time="2023-10-08T09:45:43.004408329Z" level=info msg="API listen on /var/run/docker.sock"
+ docker pull alpine:3.18
error during connect: Post "http://docker:2375/v1.24/images/create?fromImage=alpine&tag=3.18": dial tcp: lookup docker on 10.0.1.254:53: no such host

Docker daemon没有运行,我该怎么办?
当我移动'dockerd & '到Dockerfile时,它也不能工作

6yjfywim

6yjfywim1#

你不能创造你所描述的形象。如果查看Docker Hub docker image page并单击docker:dind Dockerfile,您会发现这行代码

VOLUME /var/lib/docker

VOLUME指令的后果之一是图像根本无法更改/var/lib/docker中的内容:它将在每个RUN指令之后复位。即使是像docker commit这样的紧急使用路径也不能创建包含此目录中内容的图像。
您展示的脚本原则上可以工作,但它需要在RUN行中运行,而不是作为图像的默认CMD。如果它是CMD,那么它只在容器启动时运行,这意味着每次调用都重新拉取映像,这不是您的目标。此外,由于脚本在执行拉取操作后结束,因此容器将在此时退出。
但是,Docker-in-Docker有一些复杂的要求,它通常需要以--privileged运行。您不能以特权运行单独的RUN行或整个docker build;根本就没有选择
在一个非常机械的层面上,你得到的错误是因为docker镜像的默认配置期望与同一Docker网络中名为docker的主机上的DinD Docker进行对话。(链接的代码试图在其他地方寻找Docker守护进程,但它在dockerd调用之前运行。)您需要执行类似unset DOCKER_HOST的操作以返回默认值,但随后您将遇到前面描述的其他问题。

相关问题