我在一台备用计算机上安装了 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/