更新:
我的问题没有解决,但我知道为什么它不起作用。如果您使用 docker 执行程序,当您启动作业时,gitlab-runner 二进制文件将启动一个特殊容器。这个容器是 gitlab-runner-helper,将管理 git、缓存等。
该容器通过调用在主机(localhost,物理机器)上运行的 Docker Engine API 启动。但是,由于它是“手动”启动的,因此它没有链接到任何桥接网络。或者,至少没有链接到 docker-compose 网络。因此,助手甚至不知道 gitlab 容器存在。
问题:
我只想让 gitlab 和 gitlab-runner(使用 docker 执行器)在我的本地主机上运行。我想使用 docker 和 docker-compose 安装和管理它们。
docker-compose.yml:
gitlab:
container_name: my-container-gitlab
image: gitlab/gitlab-ce:latest
ports:
- "443:443"
- "9090:80"
- "22:22"
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab'
volumes:
- ./gitlab/config:/etc/gitlab
- ./gitlab/logs:/var/log/gitlab
- ./gitlab/data:/var/opt/gitlab
gitlab-runner:
container_name: my-container-gitlab-runner
image: gitlab/gitlab-runner:latest
volumes:
- ./gitlab-runner/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
Gitlab 运行良好。Runner
注册也有效:
docker-compose run gitlab-runner register -n \
--url http://gitlab/ \
--registration-token xxxxxxxxxx \
--executor docker \
--docker-image alpine \
--description "My Docker Runner"
但是从 Gitlab Web UI 启动作业时,我得到了以下信息:
Running with gitlab-runner 11.11.2 (ac2a293c)
on My Docker Runner sBqMfFys
Using Docker executor with image alpine ...
Pulling docker image alpine ...
Using docker image sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1 for alpine ...
Running on runner-sBqMfFys-project-1-concurrent-0 via 881cd3e0423c...
Initialized empty Git repository in /builds/root/bertrand-malvaux/.git/
Fetching changes...
Created fresh repository.
fatal: unable to access 'http://gitlab-ci-token:[MASKED]@gitlab/root/bertrand-malvaux.git/':
Could not resolve host: gitlab
ERROR: Job failed: exit code 1
就我目前调查的情况而言:
- gitlab-runner 镜像是用 Ubuntu 16.04 构建的
- 它嵌入了 git
- 并使用 dumb-init 来管理进程
- 当容器启动时,它会启动 dumb-init (入口点)
- dumb-init 启动 gitlab-runner 二进制文件(用 Go 编写)
- 此二进制文件将启动 git(git clone、git fetch 等)。请参阅https://gitlab.com/gitlab-org/gitlab-runner/blob/master/shells/abstract.go
但是,正如您在上面的错误中看到的,二进制文件没有“看到”gitlab主机名。我修改了图像以检查它是否只能使用dumb-init才能在二进制文件之外看到gitlab容器,答案是肯定的。
你知道怎样让它发挥作用吗?
答案1
因此,既然我自己也遇到过这个问题,我想我会在这里回复我的解决办法和解释:
我的家庭实验室有 git-lab docker 设置,我使用 docker-compose 部署 gitlab 和 gitlab-runner 服务器。这样做是为了创建一个将两者连接在一起的网络,允许在容器内识别主机名……但不能在创建的网络之外识别。
我发现 Gitlab-runner 在运行测试时默认会启动一个容器并将其添加到“bridge”docker 网络。如果你使用 dockstation,你可以在它停止之前通过检查创建的容器的信息来查看这一点,或者对它运行 docker inspect:
docker inspect --format='{{.NetworkSettings.Networks}}' <runner temp container_id>
我让另一个容器在桥上运行,并测试“gitlab”是否能解析。结果却不能。
所以......您可以在 gitlab-runner 的 config.toml 中传递一个设置:
[[runners]]
...
[runners.docker]
network_mode= <----- THIS
此设置将告诉 gitlab-runner 在启动时将容器放置在哪个网络中,因此如果您知道 gitlab 和 gitlab-containers 运行的网络名称:
docker inspect --format='{{.NetworkSettings.Networks}}' <gitlab container id>
然后将其添加为网络模式(我的网络名称是 git-lab_default):
[[runners]]
...
[runners.docker]
network mode= "git-lab_default"
然后就好了!您的测试容器将位于同一网络中,一切顺利。
希望这对解决这个问题的任何人都有帮助。