无法 运行 GCloud SDK 的 DIND docker GitLab Runner 中的图像

Cannot run DIND for GCloud SDK docker image in GitLab Runner

我已经设置了一个简单的 .gitlab-ci 文件,它应该能够 运行 docker 服务:

docker:
  image: google/cloud-sdk:latest
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_HOST: tcp://127.0.0.1:2375
  services:
    - docker:dind
  tags:
    - docker
  script:
    - docker pull buster-slim

然而它失败了:

https://gitlab.com/knyttl/runnerdemo/-/jobs/932204050

2020-12-25T19:31:04.558361767Z time="2020-12-25T19:31:04.558195638Z" level=info msg="API listen on [::]:2375"
2020-12-25T19:31:04.558522591Z time="2020-12-25T19:31:04.558447616Z" level=info msg="API listen on /var/run/docker.sock"

该服务显然可以正确启动,但随后无法正常工作:

Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?

问题是因为 docker 守护程序不是您为此作业指定的映像 google/cloud-sdk/ 的一部分。您应该使用 google/cloud-sdk 作为基础图像来创建自己的图像。您还可以在作业的 before_script 部分中安装并启动 docker。请参阅 doc on DockerHub 了解您使用的图像:

正在安装附加组件

默认情况下,所有 gcloud 组件都安装在默认映像上(google/cloud-sdk:latest 和 google/cloud-sdk:VERSION)。 google/cloud-sdk:slim 和 google/cloud-sdk:alpine 图像不包含预安装的其他组件。

您可以按照以下说明扩展这些图像: 基于 Debian 的映像

cd debian_slim/
docker build --build-arg CLOUD_SDK_VERSION=159.0.0
    --build-arg INSTALL_COMPONENTS="google-cloud-sdk-datastore-emulator" \
    -t my-cloud-sdk-docker:slim .`

可以使用 DIND 的图像是 docker:dind,不一定是 google/cloud-sdk:latest,所以你的 .gitlab-ci.yml wuold 看起来像:

docker:
  image: docker:dind
  variables:
    DOCKER_DRIVER: overlay2
  services:
    - docker:dind
  tags:
    - docker
  script:
    - docker pull buster-slim
    # ...
    # I don't know what needs to be built...

您可以查看此 tutorial 一步一步的食谱。

事实上,这不起作用的唯一原因是:

 DOCKER_HOST: tcp://docker:2375

dind 服务可以在 cloud-sdk 图像中 运行,但它需要链接为 host