问题描述
在使用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对外是可访问的。以下是一些检查步骤:
- 确保域名
myregistry
可以被解析,并且解析结果是正确的IP地址。可以使用命令nslookup myregistry
来检查。 - 检查端口是否开放,没有被任何软件(例如防火墙或AWS安全组)阻止。可以使用命令
telnet myregistry 5050
来测试端口是否可达。 - 检查docker-registry是否受限于特定的CIDR IP范围。
- 在本地测试登录,确保登录没有问题。
这些检查可以帮助确认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失败的问题。希望这些解决方案能帮助你解决问题。