使用 dind 的 Gitlab runner 导致错误服务器行为不当

Gitlab runner using dind results in error server misbehaved

我一直在尝试在 gitlab-runner 中启动 docker 和 运行,但不断出现以下错误或 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

.gitlab-ci.yml

build:
  stage: build
  image: docker:latest
  services:
  - name: docker:dind
    alias: docker
    entrypoint: ["env", "-u", "DOCKER_HOST"]
    command: ["dockerd-entrypoint.sh"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker info

结果:

$ docker info
Client:
 Debug Mode: false

Server:
ERROR: error during connect: Get http://docker:2375/v1.40/info: dial tcp: lookup docker on 10.233.0.3:53: server misbehaving
errors pretty printing info

Runner 未处于特权模式。有没有办法在没有特权模式的情况下在 runner 中构建 docker 图像?

如果没有,还有其他做法吗?这个标志带来了什么重要的缺点?

您正试图在您的脚本中执行 运行 docker 命令 docker info,这导致了问题。您有正确的图像,但在调用 docker 信息之前,您还没有在 script 中启动 docker 守护程序。

如果您的目标是 运行 在您的构建中创建一个 docker 实例和 运行 一些自动化测试,您需要启动(可能是配置) docker gitlab ci.

脚本部分的守护进程

如果您的目标是在目标服务器上部署 docker 容器,那么您应该只在 gitlab ci 中构建 docker 镜像并通过 ssh 将镜像部署到您的来自管道的远程服务器。

没有设法让 dind 工作,所以我遇到了 kaniko 工具并设法构建图像,将其推送到 gitlab 存储库,并在此管道中的其他工作中使用它。

gitlab-ci.yml:

中缩小了此作业的定义
build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE

Gitlab 的 documentation.

当 gitlab-runner 试图访问未加密端口 2375 上的 DIND docker 套接字时,我看到服务器行为异常,而 docker 套接字暴露在端口 2376 上用于加密流量或反之亦然。

对于启用的 TLS,您必须在注册运行器时提供证书目录,这将更新运行器 config.toml 部分内的 'volumes' 指令。

TLS 启用参考:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#docker-in-docker-with-tls-enabled

TLS 禁用参考:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#docker-in-docker-with-tls-disabled