【问题标题】:Gitlab runner using dind results in error server misbehavedGitlab runner 使用 dind 导致错误服务器行为不端
【发布时间】:2020-06-08 04:00:32
【问题描述】:

我一直在尝试让 docker 在 gitlab-runner 中启动并运行,但不断收到诸如以下错误或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 未处于特权模式。有没有办法在没有特权模式的运行器中构建 docker 映像?

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

【问题讨论】:

  • 你在gitlab-ci.yml中使用的是哪张图片?
  • @UmarHussain docker:latest,这是目前唯一有效的工作和图像。

标签: docker gitlab-ci gitlab-ci-runner


【解决方案1】:

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

对于启用 TLS,您必须在注册运行程序时提供 certs 目录,这将更新运行程序的 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

【讨论】:

    【解决方案2】:

    没有设法让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

    【讨论】:

      【解决方案3】:

      您正在尝试在导致问题的脚本中运行 docker 命令docker info。您拥有正确的映像,但在调用 docker info 之前,您尚未在 script 中启动 docker 守护进程。

      如果你的目标是在你的构建中运行一个 docker 实例并运行一些自动化测试,你需要在 gitlab ci 的脚本部分启动(可能是配置)docker 守护进程。

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

      【讨论】:

        猜你喜欢
        • 2021-07-04
        • 1970-01-01
        • 2020-03-04
        • 2019-01-04
        • 1970-01-01
        • 2020-03-06
        • 2017-12-24
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多