我想做一个预加载的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时,它也不能工作
1条答案
按热度按时间6yjfywim1#
你不能创造你所描述的形象。如果查看Docker Hub
docker
image page并单击docker:dind
Dockerfile,您会发现这行代码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
的操作以返回默认值,但随后您将遇到前面描述的其他问题。