无法在 docker 内 运行 docker
unable to run docker within docker
我正在使用 gitlab,需要在容器镜像中构建一个 docker 镜像。每次我尝试这样做时,我都会收到错误消息:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
下面是我的 docker 文件,它用作我尝试 运行 我的 docker build
和其他 docker
命令的基础图像。
FROM somedeveloper/dind-aws-cli:latest
RUN apk add wget
RUN wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && \
mv jq-linux64 /usr/local/bin/jq && \
chmod +x /usr/local/bin/jq
RUN aws --version \
&& jq --version
VOLUME /var/run/docker.sock
官方的docker image with dind
我也试过了,还是不行。
根据我在网上找到的内容,每个人似乎都建议将带有套接字的卷挂载到 运行 docker 守护程序,但这似乎不起作用
不确定我在这里遗漏了什么。任何指导将不胜感激!
如果您的目标只是 运行 docker-in-docker (dind),您最好的选择是官方 Docker 图片 (docker:dind
),您可以 运行 像这样:
docker run -d --privileged --name dind docker:dind
这将适用于具有 cgroupsv1 或 v2 的系统,并且它提供 Docker 的当前版本(截至撰写本文时为 20.10.15)。
您使用的图片似乎至少已有三年历史,对于 Docker.
来说是 古老
图像有 Docker 18.06.3-ce,在当前版本的许多发行版中无法使用,因为它仅适用于 cgroups v1,而发行版正在转移到 cgroups v2.
此外,这条线对你没有任何好处:
VOLUME /var/run/docker.sock
这会在 /var/run/docker.sock
处安装一个匿名 Docker 卷,因此您最终会得到一个空目录。 Docker 守护进程希望在该位置创建一个 Unix 套接字;如果有目录,它将无法启动。
如果您从您的 Dockerfile
中删除 那一行,那么您可以成功地启动您的映像 -- 在具有 cgroupsv1 的系统上 -- 如下所示:
docker run -d --privileged --name dind my-dind-image
找到了我的问题的解决方案。
解决方案是为我的 gitlab 管道定义 DOCKER_HOST 变量,配置如下所示
image: docker:latest
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
感谢@larsks 的初步指导
我正在使用 gitlab,需要在容器镜像中构建一个 docker 镜像。每次我尝试这样做时,我都会收到错误消息:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
下面是我的 docker 文件,它用作我尝试 运行 我的 docker build
和其他 docker
命令的基础图像。
FROM somedeveloper/dind-aws-cli:latest
RUN apk add wget
RUN wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && \
mv jq-linux64 /usr/local/bin/jq && \
chmod +x /usr/local/bin/jq
RUN aws --version \
&& jq --version
VOLUME /var/run/docker.sock
官方的docker image with dind
我也试过了,还是不行。
根据我在网上找到的内容,每个人似乎都建议将带有套接字的卷挂载到 运行 docker 守护程序,但这似乎不起作用
不确定我在这里遗漏了什么。任何指导将不胜感激!
如果您的目标只是 运行 docker-in-docker (dind),您最好的选择是官方 Docker 图片 (docker:dind
),您可以 运行 像这样:
docker run -d --privileged --name dind docker:dind
这将适用于具有 cgroupsv1 或 v2 的系统,并且它提供 Docker 的当前版本(截至撰写本文时为 20.10.15)。
您使用的图片似乎至少已有三年历史,对于 Docker.
来说是 古老图像有 Docker 18.06.3-ce,在当前版本的许多发行版中无法使用,因为它仅适用于 cgroups v1,而发行版正在转移到 cgroups v2.
此外,这条线对你没有任何好处:
VOLUME /var/run/docker.sock
这会在 /var/run/docker.sock
处安装一个匿名 Docker 卷,因此您最终会得到一个空目录。 Docker 守护进程希望在该位置创建一个 Unix 套接字;如果有目录,它将无法启动。
如果您从您的 Dockerfile
中删除 那一行,那么您可以成功地启动您的映像 -- 在具有 cgroupsv1 的系统上 -- 如下所示:
docker run -d --privileged --name dind my-dind-image
找到了我的问题的解决方案。 解决方案是为我的 gitlab 管道定义 DOCKER_HOST 变量,配置如下所示
image: docker:latest
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
感谢@larsks 的初步指导