Gitlab CI服务和Docker Hub身份验证

6

由于Docker Hub对未经身份验证的拉取进行了新限制,那么如何为GitLab-CI服务验证您的Docker Hub帐户?

以下是来自GitLab文档的示例CI配置:

# from official documentation 
services:
  - postgres:12.2 # <---- this will fail at some point because it's a non-authenticated pull

variables:
  POSTGRES_DB: nice_marmot
  POSTGRES_USER: runner
  POSTGRES_PASSWORD: ""
  POSTGRES_HOST_AUTH_METHOD: trust

一段时间后,这将导致以下错误:

ERROR: Preparation failed: Error response from daemon: 
toomanyrequests: You have reached your pull rate limit. 
You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit (executor_docker.go:188:1s)
由于服务在脚本运行之前被拉取,因此我们无法在脚本部分中执行docker login。我找不到关于GitLab URL认证或环境变量认证的任何文档。
理想的解决方案不需要管理员访问GitLab-CI服务器或GitLab-CI运行程序,也不需要设置具有pull_policy = never的自定义运行程序(我们最终采用了此解决方案,但它通过单个运行程序瓶颈严重拖慢了我们的CI,特别是端对端测试)。
2个回答

7

如果需要,可以查看GitLab 13.7(2020年12月发布),以了解改进的依赖代理是否有所帮助:

避免 Docker 速率限制,加快流水线速度
为了更快、更可靠的构建,您可以使用依赖代理来缓存托管在 Docker Hub 上的容器映像。
但是,当 Docker 开始强制实施 Docker Hub 拉取请求的速率限制 时,即使从缓存中拉取了您的映像,Docker 仍将其计入您的限制次数。
这是因为依赖代理只缓存了映像的层(或 blob),而不是包含有关如何构建给定映像的信息的清单。
由于清单是必需的,因此仍需要拉取请求。这也意味着,如果 Docker Hub 不可用,您无法拉取映像。 从现在开始,依赖代理将同时缓存映像的层和清单。 因此,第一次拉取 alpine:latest,映像将被添加到依赖代理缓存并计入您的限制次数之一。
下一次拉取 alpine:latest,它将从缓存中拉取,即使 Docker Hub 不可用,也不会计入您的限制次数。
不要忘记,从里程碑 13.6 开始,依赖代理在 Core 中可用。所以,请试用一下,并告诉我们您的想法。或者更好的是,考虑为其中一个开放问题做出贡献。
请参阅 文档问题

还在使用GitLab 13.7(2020年12月)

使用预定义变量与依赖代理一起使用
通过代理和缓存来自Docker Hub的容器映像,依赖代理可以帮助您提高流水线的性能。
尽管代理旨在与CI/CD密切配合使用,但要使用此功能,您必须在gitlab.ci-yml文件中定义自己的变量或硬编码值。 这使得个人很难入手,并防止它成为可扩展的解决方案,特别是对于具有许多不同组和项目的组织。
从现在开始,您可以使用预定义环境变量作为使用依赖代理的直观方式。支持以下变量:
- CI_DEPENDENCY_PROXY_USER:用于登录依赖代理的CI用户。 - CI_DEPENDENCY_PROXY_PASSWORD:用于登录依赖代理的CI密码。 - CI_DEPENDENCY_PROXY_SERVER:用于登录依赖代理的服务器。 - CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX:通过依赖代理拉取镜像的镜像前缀。
试试看,告诉我们您的想法!
请参见文档问题

即使是私有项目,也可以使用此功能(2020年12月)

使用依赖代理与私有项目

您可以使用GitLab依赖代理代理和缓存来自Docker Hub的容器镜像。直到最近,此功能仅适用于公共组,这妨碍了许多人的使用。

现在您可以将依赖代理与私有项目一起使用。
您可以通过缓存容器镜像以供将来使用来减少对Docker Hub的依赖。

因为依赖代理正在将Docker镜像存储在与您的组关联的空间中,所以您必须使用您的GitLab用户名和密码进行身份验证,或者使用具有至少设置为read_registry范围的个人访问令牌。

请参阅文档问题


使用 GitLab 13.9(2021年2月):

自动验证使用依赖代理
通过代理和缓存来自Docker Hub的容器镜像,依赖代理帮助您提高流水线的性能。
尽管代理旨在与CI/CD密切配合使用,但要使用此功能,您必须将凭据添加到DOCKER_AUTH_CONFIG CI/CD变量中,或在流水线中手动运行docker login。这些解决方案效果很好,但考虑到需要更新多少个.gitlab-ci.yml文件,如果GitLab Runner可以自动为您进行身份验证,那将更好。
由于Runner已经能够自动通过集成的GitLab容器注册表进行身份验证,我们能够利用该功能来帮助您自动进行依赖代理身份验证。
现在使用依赖代理来代理和缓存来自Docker Hub的容器镜像变得更加容易,并开始拥有更快、更可靠的构建。
请参见文档问题

查看 GitLab 13.10(2021年3月)

使用“containerd”和Docker 20+的依赖代理

GitLab依赖代理是一个本地代理,您可以用它来访问Docker Hub上经常访问的上游镜像。在CI/CD情况下,依赖代理接收请求并从注册表返回上游镜像,充当拉动缓存。这有助于减少您的CI分钟数并提高可靠性。

然而,您以前无法通过摘要拉取映像,因为它是不可变标识符,可以确保您使用特定映像和标记的确切版本。由于“containerd”和Docker 20+都依赖于按摘要提取,这意味着许多用户无法使用依赖代理。

我们很高兴地宣布,您现在可以使用摘要从Docker Hub中拉取容器映像。您可以通过将URL添加到您的.gitlab-ci.yml文件、从命令行手动拉取映像或使用Dockerfile来使用依赖代理。查看文档并开始节省构建时间。

请参阅文档问题


优秀的答案 - Clément Prévost

0

我遇到了相同的错误,并查看了Docker文档关于toomanyrequests,其中提供了一种检索令牌的方法,该令牌可以用于Gitlab-CI

然而,对我来说还不太清楚:我刚刚尝试了第一步,在尝试获取剩余配额时收到了401未授权的错误信息 :-/

另一条有趣的路径:我们可能必须将Docker hub的凭据定义为私有存储库的凭据。但是,设置一个具有多行内容和字符如"的变量会使其无法屏蔽,考虑到我们只提供username:password,且没有加密,而是使用了base-64编码,这似乎是一个问题... :-/


1
这两种解决方案都不可行,因为它们需要运行docker login命令,而在服务运行之前我们无法运行任何命令。 - Clément Prévost
嗯,第二个 docker login 需要在本地机器上执行(引用),“明确处理从私有镜像开始作业”的问题。 - Joël
哦,好的。我应该明确一下,我没有访问GitLab Runner机器的权限,也不能添加自己的Runner。当然,这都是出于安全考虑。 - Clément Prévost
即使我没有完全理解(而且我的问题在此期间消失了...),但我认为第二种解决方案是:1. 在您的计算机上进行docker login,2. 获取输出并将其编写为Gitlab-CI环境参数。然后,当runner启动新作业时,它将使用提供的凭据。虽然我还没有测试过。 - Joël

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接