Docker 登录 Gitlab 注册表失败,并显示“http:服务器向 HTTPS 客户端提供了 HTTP 响应”

问题描述 投票:0回答:2

我有 2 个 EC2,一个安装了 Gitlab-ee,另一个安装了 Docker 并运行 Gitlab-Runner 和一个注册表容器。

Gitlab-Runner 正在工作,并获取对 Gitlab 的提交,并将其发送到 docker 进行构建阶段。然而,在构建阶段,当 docker 容器尝试登录注册表容器时,会出现错误“http:服务器向 HTTPS 客户端提供了 HTTP 响应”

Docker登录代码:

docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

故障排除完成:

  • 如果我通过 ssh 进入服务器,我可以使用
    sudo docker login localhost:5000
  • 登录
  • 如果使用 $CI_REGISTRY / localhost / DNS 名称引用注册表,也会发生相同的错误
  • 我确保 CI_REGISTRY 在 gitlab.rb 中设置
  • 我在网上看到一些关于需要在 docker.service Exec 行中使用 --insecure-registries 标志的内容,我也这样做了并得到了相同的错误。
  • 如果 docker 安装在同一台服务器上,这是可行的,但我试图将两个应用程序相互解耦,以便可以单独管理它们。

软件版本:

  • Docker 版本:19.03.6
  • Gitlab-ee版本:12.8.1
  • Gitlab-Runner 版本:12.8.0

如果有人可以帮助我,我将不胜感激!我已经用头撞它两天了。

docker gitlab
2个回答
1
投票

我相信这个问题缺乏细节,无法为您提供所需的解决方案。无论如何,我会尝试概述您可能遇到的一些问题。

注册表配置为仅 HTTP

消息“http:服务器向 HTTPS 客户端提供了 HTTP 响应”准确地表明 HTTPS 客户端(即

docker login
)正在套接字 localhost:5000 上期待 TLS (HTTPS) 服务器。

但是您的注册服务器仅配置了 HTTP,不支持 TLS。这就是服务器向 HTTPS 客户端返回 HTTP 响应的原因。

要解决此问题,请遵循官方 docker 指南

容器的 localhost 与主机的 localhost 不同

如果你在 gitlab-runner 中使用 docker executor,这个案例值得一读。 这意味着您的 gitlab-runner 会为每个传入作业创建新容器。

您没有共享

CI_REGISTRY
变量的值。 但是,我认为它可能等于 localhost 或域名。 请注意,容器中的 localhost 与主机的 localhost 不同,因为它们位于不同的网络命名空间中。

如果设置了域名的值,请确保该域名在容器命名空间中是可解析的。

容器的 Docker 守护进程在没有不安全注册表标志的情况下运行

您标记为您已尝试过

--insecure-registries
标志,但没有成功。 确保您已将其配置为容器的 Docker 守护进程,而不是主机的 Docker。

如果您使用 Docker-in-Docker 镜像来处理基本上运行单独 Docker 守护进程的作业,这就是事实。

希望这些信息对那些仍在苦苦挣扎的人有用......


0
投票

我尝试了很多方法,但没有成功。仅编辑 /lib/systemd/system/docker.service 并添加 DOCKER_OPTS="--insecure-registry REGISTRY_IP:REGISTRY_PORT" 有效。 这是一个例子: [服务] ExecStart=/usr/bin/docker -d --insecure-registry REGISTRY_IP:REGISTRY_PORT

检查这个

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.