问题描述
在使用GitLab CI/CD时,遇到了一个问题。他的CI pipeline无法拉取仓库,并且出现了以下错误信息:
Running with gitlab-runner 14.3.1 (8b63c432) on 61f761c24d2a 6sxYm825
Preparing the "docker" executor
Using Docker executor with image gcc ...
Pulling docker image gcc ...
Using docker image sha256:f323b5207c6c929853380a3bfa268c899d8f0120f4364768af24dae31e92c279 for gcc with digest gcc@sha256:1b0593e75693f0f2480910b33b02119f6ad891a5a02a61a6e293ad09c8c3eef1 ...
Preparing environment
Running on runner-6sxym825-project-2-concurrent-0 via da14575dda62...
Getting source from Git repository
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/root/project/.git/
fatal: unable to access 'http://gitlab/root/project.git/': Could not resolve host: gitlab
ERROR: Job failed: exit code 1
用户怀疑是由于Docker容器无法解析主机名导致的,因为它运行在另一个Docker容器内部。他想知道如何解决这个问题,是否需要将Docker添加到Docker Compose网络中,或者以某种方式告诉它http://gitlab/实际上是什么。
用户还提到他已经更改了/etc/gitlab/gitlab.rb
文件中的外部URL配置。
以下是用户提供的相关配置文件:
# .gitlab-ci.yml
image: gcc
build:
stage: build
script:
- echo 123
# /etc/gitlab/gitlab.rb
external_url 'http://gitlab/'
# /etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0
[[runners]]
name = "61f761c24d2a"
url = "http://gitlab/"
token = "6sxYm825Sa7mwRwRBpyg"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:19.03.12"
privileged = true
disable_cache = false
volumes = ["/certs/client", "/cache"]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
# docker-compose.yml
version: '3.5'
services:
gitlab:
image: gitlab/gitlab-ce:latest
hostname: gitlab
container_name: gitlab
restart: unless-stopped
environment:
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails['gitlab_shell_ssh_port'] = 8822
ports:
- "8000:80"
- "8822:22"
volumes:
- ./config/gitlab:/etc/gitlab
- ./data/gitlab:/var/opt/gitlab
- ./logs:/var/log/gitlab
networks:
- gitlab
gitlab-runner:
image: gitlab/gitlab-runner
container_name: runner
restart: unless-stopped
depends_on:
- gitlab
volumes:
- ./config/gitlab-runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
networks:
- gitlab
networks:
gitlab:
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据用户提供的配置文件,我们可以看到GitLab和GitLab Runner都运行在Docker容器中。在这种情况下,Docker容器内部无法直接解析主机名。
要解决这个问题,我们可以将GitLab和GitLab Runner容器添加到同一个Docker网络中。这样它们就可以通过容器名称相互解析。
以下是解决方案的步骤:
1. 打开docker-compose.yml
文件。
2. 在networks
部分添加一个新的网络,例如gitlab_network
。
3. 将gitlab
和gitlab-runner
服务的networks
属性修改为新的网络名称。
4. 保存并关闭文件。
5. 在终端中,导航到包含docker-compose.yml
文件的目录。
6. 运行以下命令启动GitLab和GitLab Runner容器:
docker-compose up -d
这将启动GitLab和GitLab Runner容器,并将它们连接到同一个网络中。
7. 等待容器启动完成。
8. 现在,GitLab Runner应该能够解析主机名gitlab
。重新运行CI pipeline,应该能够成功拉取仓库。
方案2
如果方案1无法解决问题,你可以尝试在GitLab Runner容器中添加额外的DNS解析配置。
以下是解决方案的步骤:
1. 打开/etc/gitlab-runner/config.toml
文件。
2. 在[[runners.docker]]
部分添加以下配置:
toml
[runners.docker]
dns = ["your_dns_server_ip"]
将your_dns_server_ip
替换为你的DNS服务器的IP地址。
3. 保存并关闭文件。
4. 重新启动GitLab Runner容器,以使配置生效。
现在,GitLab Runner容器应该能够使用指定的DNS服务器解析主机名。重新运行CI pipeline,应该能够成功拉取仓库。
方案3
如果以上两种方案都无法解决问题,你可以尝试在GitLab Runner容器中修改/etc/hosts
文件,手动添加主机名和IP地址的映射关系。
以下是解决方案的步骤:
1. 打开/etc/gitlab-runner/config.toml
文件。
2. 在[[runners.docker]]
部分添加以下配置:
toml
[runners.docker]
extra_hosts = ["gitlab:your_gitlab_ip"]
将your_gitlab_ip
替换为你的GitLab服务器的IP地址。
3. 保存并关闭文件。
4. 重新启动GitLab Runner容器,以使配置生效。
现在,GitLab Runner容器应该能够通过主机名gitlab
解析到指定的IP地址。重新运行CI pipeline,应该能够成功拉取仓库。
总结
在GitLab CI/CD中,如果Pipeline无法拉取仓库,可能是由于Docker容器无法解析主机名导致的。你可以尝试将GitLab和GitLab Runner容器添加到同一个Docker网络中,或者在GitLab Runner容器中配置额外的DNS解析或修改/etc/hosts
文件来解决这个问题。