Gitlab CI推送到docker-registry失败的解决方案

57次阅读
没有评论

问题描述

在使用GitLab CI时,尝试将镜像推送到一个独立的docker-registry,但在运行CI流水线时遇到了错误。以下是他的问题和相关配置:

用户创建了一个名为testuser,密码为testpassword的用户,并且他在.gitlab-ci.yml中定义了一个CI流水线的配置。但在运行流水线时,他遇到了以下错误:

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://myregistry:5000/v2/: dial tcp: lookup worker1 on 192.168.123.456:53: no such host
ERROR: Job failed: exit code 1

用户可以在GitLab服务器上成功登录到docker-registry,但在CI流水线中出现了上述错误。

解决方案

首先,要确保docker-registry对外是可访问的。以下是一些检查步骤:

  1. 确保域名myregistry可以被解析,并且解析结果是正确的IP地址。可以使用命令nslookup myregistry来检查。
  2. 检查端口是否开放,没有被任何软件(例如防火墙或AWS安全组)阻止。可以使用命令telnet myregistry 5050来测试端口是否可达。
  3. 检查docker-registry是否受限于特定的CIDR IP范围。
  4. 在本地测试登录,确保登录没有问题。

这些检查可以帮助确认docker-registry是否可以在CI流水线中正常访问。如果问题仍然存在,可以继续尝试以下操作。

下面的解决方案中涉及到一些命令和配置,可能需要根据实际情况进行修改。请在操作前备份相关配置,以防止意外损失。

解决方案1

尝试使用--password-stdin来替代--password,这是一个更安全的方式。修改.gitlab-ci.yml中的docker登录命令,如下所示:

# ...
script:
  - echo "testpassword" | docker login -u testuser --password-stdin https://myregistry:5000
  - docker ps
  - docker build -t $REGISTRY .
  - docker push $REGISTRY
# ...

这里通过管道将密码传递给docker login命令,以避免在命令行中暴露密码。

解决方案2

确认GitLab Runner的配置,确保DOCKER_HOST变量被正确设置。可以在/etc/gitlab-runner/config.toml中查找并确认是否存在类似以下配置:

[[runners]]
  name = "docker-ci"
  # ...
  pre_build_script = "export DOCKER_HOST=tcp://docker:2375"
  # ...

确保DOCKER_HOST的值设置为tcp://docker:2375

解决方案3

.gitlab-ci.yml中增加环境变量,指定使用DOCKER_TLS_CERTDIR为空。这样可以解决DOCKER_TLS_CERTDIR相关的问题。

# ...
image: docker:latest
services:
  - docker:18.09.7-dind
variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""
REGISTRY: myregistry:5000/golang-tests
# ...

以上是一些常见的解决方案,根据你的具体情况,可以尝试逐一进行排查,以解决CI流水线中推送到docker-registry失败的问题。希望这些解决方案能帮助你解决问题。

正文完