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

Mik*_*ock 9 gitlab docker

我有 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

如果有人能在这方面帮助我,我将不胜感激!我已经用头撞它两天了。

mdr*_*ich 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不同,因为它们位于不同的网络命名空间中。

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

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

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

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

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