使用docker-compose时,容器中的gitlab-runner进程找不到gitlab容器

使用docker-compose时,容器中的gitlab-runner进程找不到gitlab容器

更新: 我的问题没有解决,但我知道为什么它不起作用。如果您使用 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"

然后就好了!您的测试容器将位于同一网络中,一切顺利。

希望这对解决这个问题的任何人都有帮助。

相关内容