Gitlab CI 服务和 docker hub 身份验证

2024-03-19

Due to 新的限制 https://docs.docker.com/docker-hub/download-rate-limit/在 docker hub 未经身份验证的拉取中,如何为 gitlab-ci 服务验证 docker hub 帐户?

这是来自的示例 CI 配置gitlab 文档 https://docs.gitlab.com/ee/ci/services/postgres.html:

# 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 auth 或环境变量 auth 的文档。

理想的解决方案不需要对 gitlab-ci 服务器或 gitlab-ci 运行程序具有管理员访问权限,也不需要使用以下命令设置自定义运行程序pull_policy = never(我们最终这样做了,但由于 e2e 测试的单个运行器瓶颈,它大大减慢了我们的 CI)


还要检查,与亚搏体育appGitLab 13.7 https://about.gitlab.com/releases/2020/12/22/gitlab-13-7-released/#avoid-docker-rate-limits-and-speed-up-your-pipelines(2020 年 12 月)如果改进的依赖代理可以提供帮助:

避免 Docker 速率限制并加快管道速度

为了更快、更可靠的构建,您可以使用依赖代理来缓存 Docker Hub 上托管的容器映像。

但是,当 Docker 开始强制执行时来自 Docker Hub 的拉取请求的速率限制 /blog/2020/10/30/mitigating-the-impact-of-docker-hub-pull-requests-limits/,您注意到即使从缓存中提取图像,Docker 也会将其计入您的限制。
这是因为依赖代理仅缓存图像的层(或 blob),而不缓存清单,清单包含有关如何构建给定图像的信息。
由于需要清单,因此仍然需要拉取请求。这也意味着如果 Docker Hub 不可用,您将无法提取映像。

展望未来,依赖代理将缓存图像的层和清单。

所以,第一次拉的时候alpine:latest,该图像将被添加到依赖代理缓存中,并计为对您的速率限制的一次拉取。
下次拉的时候alpine:latest,即使 Docker Hub 不可用,也会从缓存中提取not计入您的速率限制。

不要忘记,从里程碑 13.6 开始,依赖代理在 Core 中可用 /releases/2020/11/22/gitlab-13-6-released/#the-dependency-proxy-is-now-open-source。因此,请尝试一下并让我们知道您的想法。或者更好的是,考虑为开放项目之一做出贡献.

See 文档 https://docs.gitlab.com/ee/user/packages/dependency_proxy/#docker-hub-rate-limits-and-the-dependency-proxy and Issue https://gitlab.com/gitlab-org/gitlab/-/issues/241639.

And:

仍然与亚搏体育appGitLab 13.7 https://about.gitlab.com/releases/2020/12/22/gitlab-13-7-released/#use-pre-defined-variables-with-the-dependency-proxy(2020年12月)

将预定义变量与依赖代理一起使用

通过代理和缓存来自 Docker Hub 的容器映像,依赖代理可以帮助您提高管道的性能。

尽管代理旨在与 CI/CD 一起大量使用,但要使用该功能,您必须在文件中定义自己的变量或硬编码值gitlab.ci-yml file.
这使得个人很难上手,并且无法成为可扩展的解决方案,特别是对于拥有许多不同团队和项目的组织而言。

继续前进,您可以使用预定义环境变量 https://docs.gitlab.com/ee/ci/variables/predefined_variables.html作为使用依赖代理的直观方式。支持以下变量:

  • CI_DEPENDENCY_PROXY_USER:登录依赖代理的 CI 用户。
  • CI_DEPENDENCY_PROXY_PASSWORD:用于登录依赖代理的 CI 密码。
  • CI_DEPENDENCY_PROXY_SERVER:登录依赖代理的服务器。
  • CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX:通过依赖代理拉取镜像的镜像前缀。

尝试一下,让我们知道您的想法!

See 文档 https://docs.gitlab.com/ee/user/packages/dependency_proxy/#authenticate-within-cicd and Issue https://gitlab.com/gitlab-org/gitlab/-/issues/280582.

这甚至适用于私人项目 https://about.gitlab.com/releases/2020/12/22/gitlab-13-7-released/#use-the-dependency-proxy-with-private-projects(2020年12月)

将依赖代理与私有项目一起使用

您可以使用 GitLab 依赖代理来代理和缓存来自 Docker Hub 的容器映像。直到最近,该功能仅适用于公共团体,导致许多人无法使用它。

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

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

See 文档 https://docs.gitlab.com/ee/user/packages/dependency_proxy/index.html#authenticate-with-the-dependency-proxy and Issue https://gitlab.com/gitlab-org/gitlab/-/issues/11582.


With 亚搏体育appGitLab 13.9 https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#automatically-authenticate-when-using-the-dependency-proxy(2021 年 2 月):

使用依赖代理时自动进行身份验证

通过代理和缓存来自 Docker Hub 的容器映像,依赖代理可以帮助您提高管道的性能。

尽管代理旨在与 CI/CD 一起大量使用,但要使用该功能,您必须将凭据添加到DOCKER_AUTH_CONFIGCI/CD 变量或手动运行docker login在你的管道中。这些解决方案效果很好,但是当您考虑有多少.gitlab-ci.yml如果您需要更新文件,如果 GitLab Runner 能够自动为您进行身份验证,那就更好了。

由于 Runner 已经能够通过集成的 GitLab 容器注册表自动进行身份验证,因此我们能够利用该功能来帮助您通过依赖代理自动进行身份验证。

现在,可以更轻松地使用依赖代理来代理和缓存来自 Docker Hub 的容器映像,并开始进行更快、更可靠的构建。

See 文档 https://docs.gitlab.com/ee/user/packages/dependency_proxy/#authenticate-within-cicd and Issue https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27302.


See 亚搏体育appGitLab 13.10 https://about.gitlab.com/releases/2021/03/22/gitlab-13-10-released/#use-the-dependency-proxy-with-containerd-and-docker-20(2021 年 3 月)

将依赖代理与“containerd”和 Docker 20+ 一起使用

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

但是,您无法通过摘要提取图像,摘要作为不可变的标识符可确保您使用特定图像和标签的确切版本。既然两者containerdDocker 20+ 依赖于 pull-by-digest,这意味着你们中的许多人被阻止使用依赖代理。

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

See 文档 https://docs.gitlab.com/ee/user/packages/dependency_proxy/#store-a-docker-image-in-dependency-proxy-cache and Issue https://gitlab.com/gitlab-org/gitlab/-/issues/290944.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gitlab CI 服务和 docker hub 身份验证 的相关文章

随机推荐

  • 音乐播放列表数据库设计

    如何构建歌曲和播放列表的表格 我的想法是创建一个播放列表标题和 id 的表 然后创建一个播放列表歌曲表 其中保存歌曲的唯一 id 及其所属的播放列表 另一个为每个播放列表规划一个新表 并将播放列表的歌曲信息存储在每个表中 这是一个好方法还是
  • GenyMotion 无法启动 Genymotion 虚拟设备

    当我运行 Genymotion 时 出现以下错误 无法启动 Genymotion 虚拟设备 无法为虚拟设备配置网络适配器 请检查以下几点 在 VirtualBox 中 在软件的主要参数中 检查是否存在 Host only 网络适配器 在 V
  • C 字符值算术

    我一直在阅读 C 编程语言 一书来学习 C 我偶然发现了算术s i 0 他们说它给出了存储在 s i 中的字符的数值 我不太明白 它怎么能通过减法给出值呢 注意 这用在 atoi 函数中 该函数将数字字符串转换为其等价的数字 谢谢 可能重复
  • 如何通过命令行关闭Android模拟器

    我无法从命令提示符正常停止模拟器 我使用的是 Linux Ubuntu v10 04 64 位 和 Android v2 3 API 9 Gingerbread 我使用其快照启动了模拟器 现在我关心的是优雅地关闭正在运行的模拟器实例 我尝试
  • 手机应用程序设计指南[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有包含创建移动电话应用程序的设计指南的文档或文章 如何构建应用程序以获得理想的用户体验 用户界面和键
  • 通过API重置登录cookie

    我想知道是否有任何方法可以通过API重置登录cookie 我知道如何通过管理中的设置来做到这一点 切换changePasswordAtNextLoginG Suite 用户的标记将其从所有设备中注销 使changePasswordAtNex
  • 如何使用 JsTestDriver 测试 jquery 和 ajax 调用?

    我有一个用 jQuery 构建的动态页面 Html 片段加载自mustache http mustache github com 模板 这些模板是从 URL 下载的 我想对整个 html 结构进行单元测试 JsTestDriver 测试是
  • 并发数据库访问给出 IllegalStateException

    我正在尝试为 1 个方法生成一个线程 我得到一个IllegalStateException 见下文 该方法的作用是接受与数据库的连接和数据库名称 并从中生成 XML 这部分有效 我只是想用一个新线程让它运行得更快 因为我有多个 XML 文件
  • Foreach 循环中的多个变量 [PowerShell]

    是否可以将两个变量放入 Foreach 循环中 以下是针对 PowerShell ASP 的编码 我的 Foreach 循环中的语法不正确 但您应该能够破译我试图构建的逻辑 list Get QADUser userid includeAl
  • XCTest:运行测试失败,且 Cycle inside X;在使用 CocoaPods 和 Carthage 的项目中,构建可能会产生不可靠的结果

    将我的项目升级到 Xcode 12 后 测试套件停止工作 测试目标无法编译 失败并显示 Cycle inside
  • Angular URL“trustAsResourceUrl”不起作用

    我在用着角度文件上传 js https github com nervgh angular file upload并上传图像 上传成功后 它会返回图像托管位置的 URL 该图像在 Azure 上作为 blob 托管 上传成功 并且正确返回
  • 如何搜索不在任何html标签中的url,然后将其转换为超链接?

    所以我的问题是 在相同的内容中有 iframe 图像标签等 它们都有正则表达式匹配 可以将它们转换为正确的格式 最后剩下的就是普通的 URL 我需要一个正则表达式 它将找到所有只是链接而不是在 iframe img 或任何其他标签内的链接
  • 在 Swing 应用程序中仅使用 JavaFX 触摸事件

    有没有办法在 swing 应用程序中使用 JavaFX 触摸事件 目前我正在使用 JFXPanel 来捕获 JavaFX 事件 但是当我尝试获取事件时 我没有收到任何触摸事件 而只收到鼠标事件 这是在 Windows 8 1 戴尔触摸屏上进
  • 如何在 C# 中确定进程的所有者?

    我正在寻找名为 MyApp exe 的进程 并且我想确保获得特定用户拥有的进程 我使用以下代码来获取进程列表 Process processes Process GetProcessesByName MyApp 这给了我一个进程列表 但是
  • UITextView - 使用 NSBackgroundColor 突出显示文本 - 排除换行符

    我有一个带有文本突出显示的工作功能 问题是它还突出显示换行符 看图片 下面是我用来突出显示的函数 void setHighlight set highlighted block BOOL textIsHighlited YES self a
  • 将房间数据库存储在 Google Drive 应用程序文件夹中?

    我还不熟悉Room https developer android com topic libraries architecture room html和 Google Drive API 我想知道是否可以创建 Room 数据库并将其存储在
  • 信号好的情况下GPS更新间隔越快?

    我试图限制我的程序每 10 秒更新一次位置 而不是不断更新 以减少电池消耗 当我在室内调试且信号较弱 即 GPS 图标闪烁 时 此方法工作正常 但如果手机得到正确修复 即 GPS 图标静态 更新间隔会增加到大约一秒 我知道代码mLocati
  • 如何在 FILTERXML 中连接 XML 子级

    我可能有这样的 XML 字符串
  • REST如何实现多态POST端点:抽象类型需要映射到具体的JSON类型

    我从事 SpringBoot 应用程序的工作 我有以下类层次结构 public abstract class DlqMessage Long id UUID employeeId EventReason reason public clas
  • Gitlab CI 服务和 docker hub 身份验证

    Due to 新的限制 https docs docker com docker hub download rate limit 在 docker hub 未经身份验证的拉取中 如何为 gitlab ci 服务验证 docker hub 帐