无法在 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 的初步指导