gitlab - 如何在特权模式下在本地安装的 gitlab-runner 上使用 docker-in-docker

标签 gitlab gitlab-ci gitlab-ci-runner

我在一台备用计算机上安装了 GitLab Runner,用于通过标记某些作业来运行 CI 作业。但是,我的管道中的一些作业需要 docker-in-docker,我目前无法在本地 gitlab 运行器上运行这些作业。相反,我在 gitlab.com 上的共享运行器上运行它们。我已通读文档,显示如何在 gitlab-runner 中使用 docker 执行器的特权模式:

https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode

这是我用来在我的机器上注册 gitlab-runner 的命令:

sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "$PROJECT_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "docker-runner" \
  --tag-list "privileged" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

这是由上述命令生成的/etc/gitlab-runner/config.toml:

sudo cat /etc/gitlab-runner/config.toml
[sudo] password for brian: 
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "docker-runner"
  url = "https://gitlab.com/"
  token = "my-token-abcd-1234"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    pull_policy = "always"
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

这是我尝试在特权模式下运行的作业:

Build backend:
  tags:
    - privileged
  stage: build
  image: docker:stable
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_DRIVER: overlay2
  services:
    - docker:dind
  before_script:
    - |
      docker login \
        -u $CI_REGISTRY_USER \
        -p $CI_REGISTRY_PASSWORD \
        $CI_REGISTRY
  script:
    - |
      docker build \
        -t $CI_REGISTRY_IMAGE/backend:latest \
        -f backend/scripts/prod/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE/backend:latest
  only:
    changes:
      - backend/**/*

这是我运行此作业时看到的错误:

$ docker login \ # collapsed multi-line command
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
$ docker build \ # collapsed multi-line command
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

我可以看到该作业正在被我的运行程序拾取,并且它正在我的本地计算机上启动容器,但它在 docker build 命令上失败,如上所示。

我发现以下 gitlab 问题,并尝试了一个似乎对很多人都有效的解决方案:https://gitlab.com/gitlab-org/gitlab-runner/issues/1986#note_20339074

这里似乎列出了许多其他解决方案,并且对于正确的方法也存在很多困惑。

最佳答案

我在写问题时解决了这个问题,但我想分享以帮助更容易找到该解决方案。

上述线程 ( https://gitlab.com/gitlab-org/gitlab-runner/issues/1986 ) 的末尾链接到一篇有用的文章: https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/

如文章中所述,禁用 TLS 对我有用。

保持所有内容与我在问题中描述的相同,添加

DOCKER_TLS_CERTDIR: ""

到作业的 variables 部分允许作业继续进行,不会出现错误。

关于gitlab - 如何在特权模式下在本地安装的 gitlab-runner 上使用 docker-in-docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58752708/

相关文章:

docker - gitlab在docker内部运行docker

c++ - 为什么更改链接顺序可以修复一个系统上的一些链接错误?

Gitlab git push 因 Vagrant 管理的 Virtualbox 而失败

yaml - 如何合并 GitLab CI 作业上的规则

使用 Gitlab CI 错误的 Laravel Dusk 测试,无法连接到端口 :9515: Connection refused

docker - 已安装PHP,Composer和Docker的Docker镜像

Git 仅在 GitLab 中记录不明确的参数

git - 在 Gitlab 中新建一个分支

gitlab - 如何在GitLab CI中获取ci用户名?