关于 Quay IO


Red Hat Quay 3

关于 Quay IO

Red Hat OpenShift Documentation Team

摘要

关于 Quay IO

前言

本指南为用户提供了使我们最强大、功能丰富的容器注册中心服务 Quay.io 所需的知识和工具。

第 1 章 quay.io 概述

Quay.io 是一个用于存储和构建容器镜像的注册表,也可用于分发容器镜像和其他工件。它提供免费和付费层来满足各种用户需求,并且主要托管在美国(Amazon Web Services 的us-east-1 区域),其中有 CDN 边缘服务器在整个世界中分散。

Quay.io 灵活,易于使用,允许用户上传和管理容器镜像。开发人员可以创建私有存储库,确保敏感或专有代码在其机构中保持安全。此外,用户可以设置访问控制和管理团队协作,从而在指定团队成员之间实现容器镜像的无缝共享。

Quay.io 通过集成的镜像扫描程序 Clair 解决了容器安全顾虑。该服务会自动扫描容器镜像以了解已知漏洞和安全问题,为开发人员提供对潜在风险的宝贵见解,并建议补救步骤。

Quay.io 过量自动化,并支持与流行的持续集成/持续部署(CI/CD)工具和平台集成,实现容器构建和部署流程的无缝自动化。因此,开发人员可以简化其工作流,从而显著降低人工干预并提高了整体开发效率。

Quay.io 满足大型和小型部署的需求。平台可以处理大量容器镜像流量,并提供有效的复制和分发机制,以将容器镜像传送到各种地理位置。

通过 Quay.io,开发人员可以发现由其他用户共享的预构建公共容器镜像的集合,从而更轻松地为其项目查找有用的工具、应用程序和服务。

第 2 章 Quay.io 支持

技术支持是 Quay.io 容器注册表服务的关键方面,不仅有助于管理容器镜像,还可确保托管平台的功能和可用性。

为了帮助用户遇到与功能相关的问题,红帽提供了 Quay.io 客户对多个资源的访问权限。红帽知识库 包含可最大化红帽产品和技术潜力的宝贵内容。用户可以查找文章、产品文档和视频,以概述了安装、配置和使用红帽产品的最佳实践。它还充当已知问题解决方案的中心,提供简洁的根原因描述和补救步骤。

此外,Quay.io 客户还可以关注技术支持团队,以解决问题、排查问题并提供针对平台优化体验的解决方案。无论它涉及了解特定功能、自定义配置还是解决容器镜像构建问题,支持团队都专用于通过具有清晰和专业知识的每个步骤指导用户。

对于与 Quay.io 状态页上 未列出的服务中断或性能问题相关的事件,其中包括可用性和功能问题,给客户可以使用 红帽客户门户网站 引发技术支持票据。服务事件定义为影响平台的多个用户的计划外中断服务或减少服务质量。

通过这一全面的技术支持系统,Quay.io 确保用户可以自信地管理其容器镜像、优化其平台体验并克服可能出现的任何挑战。

第 3 章 Quay.io 用户界面概述

Quay.io 的用户界面(UI)是一个基本的组件,充当用户网关,用于管理平台生态系统中的容器镜像并与之交互。Quay.io 的 UI 旨在提供直观易用的界面,方便所有技能水平的用户轻松浏览和利用 Quay.io 的特性和功能。

本文档部分旨在向用户介绍 Quay.io UI 的关键元素和功能。它将涵盖 UI 布局、导航和关键功能等重要方面,为用户探索和制作大部分 Quay.io 容器注册表服务提供了稳定的基础。

在这个文档中,按步骤说明、可视化帮助和实用示例在以下主题中提供:

  • 探索应用程序和软件仓库
  • 使用 Quay.io 教程
  • pricing 和 Quay.io 计划
  • 登录和使用 Quay.io 功能

本文档一起确保用户可以快速获取 UI 的 nuances,并通过 Quay.io 成功浏览其容器化过程。

3.1. quay.io 登录页面

Quay.io 登录页面充当用户访问所提供的容器 registry 服务的中央 hub。本页提供了必要的信息和链接,以协助用户安全地存储、构建和部署容器镜像。

Quay.io 的登录页面包括到以下资源的链接:

  • 了解.在本页中,您可以搜索 Quay.io 数据库以查找各种应用程序和存储库。
  • 教程.在本页中,您可以逐步执行一个显示如何使用 Quay.io。
  • 定价.在本页中,您可以了解 Quay.io 提供的各种定价层。本页上还介绍了各种常见问题解答。
  • 登录。通过单击此链接,您会被重新定向到您的 Quay.io 存储库。

Quay.io header .

登录页面还包括关于计划维护的信息。在调度的维护期间,Quay.io 在只读模式下运行,并正常拉取功能。推送和构建在计划的维护期间无法正常运行。您可以通过进入到 Quay.io Status 页面并点 Subscribe To Updates 订阅有关 Quay.io 维护的更新。

Scheduled maintenance banner

登录页面还包括以下资源的链接:

  • 文档.本页提供了使用 Quay.io 的文档。
  • 术语.本页提供有关红帽在线服务的法律信息。
  • 隐私.本页提供有关红帽隐私声明的信息。
  • 安全性. 本页提供有关 Quay.io 安全性的信息,包括 SSL/TLS、加密、密码、访问控制、防火墙和数据弹性。
  • 关于.此页面包含有关所使用的软件包和项目以及产品简短历史的信息。
  • 联系。本页包含有关支持及联系红帽支持团队的信息。
  • 所有系统操作.此页面包含 Quay.io 的状态和维护简短历史记录的信息。
  • Cookie。单击此链接,会出现一个弹出框,供您设置 Cookie 首选项。

Quay.io footer .

您还可以在 内部查找有关 Trying Red Hat Quay 或在云中 尝试 Red Hat Quay 的信息,这会将您重定向到 pricing 页面。每个选项都提供免费试用。

3.1.1. 创建 Quay.io 帐户

Register for a Red Hat account 需要新的 Quay.io 用户,并创建一个 Quay.io 用户名。这些帐户会关联,但有两个不同的区别:

  • Quay.io 帐户可用于推送和拉取容器镜像,或将 Open Container Initiative 镜像推送到 Quay.io 以存储镜像。
  • Red Hat 帐户允许用户访问 Quay.io 用户界面。对于付费客户,这个帐户也可以用于 从红帽生态系统目录 访问镜像,该目录 可推送到其 Quay.io 存储库。

用户必须首先注册红帽帐户,然后创建一个 Quay.io 帐户。用户需要这两个帐户来正确使用 Quay.io 的所有功能。

3.1.1.1. 注册红帽帐户

使用以下步骤为 Quay.io 注册红帽帐户。

流程

  1. 导航到 红帽客户门户
  2. 在导航窗格中,单击 Log In
  3. 当导航到登录页面时,单击 Register for a Red Hat Account
  4. 输入红帽登录 ID。
  5. 输入密码。
  6. 输入以下个人信息:

    • 电子邮件地址
    • 电话号码
  7. 输入以下与您所在国家或地区相关的联系信息。例如:

    • 国家/区域
    • 地址
    • 邮政编码
    • 城市
    • County
  8. 选择并同意红帽的条款和条件。
  9. 单击 Create my account
  10. 导航到 Quay.io 并登录。
3.1.1.2. 创建 Quay.io 用户帐户

使用以下步骤创建 Quay.io 用户帐户。

先决条件

  • 您已创建了红帽帐户。

流程

  1. 如果需要,点 I am not a machine and confirming 来解析 captcha。您将被重定向到 Confirm Username 页面。
  2. Confirm Username 页面上,输入用户名。默认情况下生成一个用户名。如果同一用户名已存在,则在末尾添加一个数字,使其是唯一的。此用户名用作 Quay Container Registry 中的命名空间。
  3. 在决定用户名后,单击 Confirm Username。您会被重定向到 Quay.io Repositories 页面,它充当一个专用的 hub,用户可以在其中轻松访问和管理其存储库。在这个页面中,用户可以有效地组织、导航并与其容器镜像和相关资源交互。
3.1.1.3. Quay.io 单点登录支持

Red Hat Single Sign On (SSO)可用于 Quay.io。使用以下步骤设置带有 Quay.io 的 Red Hat SSO。对于大多数用户,这些帐户已经链接。但是,对于某些旧的 Quay.io 用户,可能需要这个过程。

先决条件

  • 您已创建了 Quay.io 帐户。

流程

  1. 导航到 Quay.io Recovery 页面
  2. 输入您的用户名和密码,然后单击 Sign in to Quay Container Registry
  3. 在导航窗格中,点击您的用户名 → 帐户设置
  4. 在导航窗格中,单击 External Logins and Applications
  5. 单击 Attach to Red Hat
  6. 如果您已在 Red Hat SSO 中签名,您的帐户会自动链接。否则,系统会提示您通过输入您的 Red Hat 登录或电子邮件和密码登录 Red Hat SSO。或者,您可能需要首先创建新帐户。

    登录 Red Hat SSO 后,您可以选择从登录页面中使用您的红帽帐户对 Quay.io 进行身份验证。

其他资源

3.1.2. 探索 Quay.io

Quay.io Explore 页面是一个有价值的 hub,允许用户获取 Quay.io 社区共享的大量容器镜像、应用程序和存储库。通过其直观、用户友好的设计,Explore 页面提供了强大的搜索功能,让用户能够轻松发现容器化的应用程序和资源。

3.1.3. 试用 Quay.io (已弃用)

注意

Red Hat Quay 指南目前已弃用,并将在 v2 UI 正式发布(GA)时删除。

Quay.io Tutorial 页面为用户提供并介绍 Quay.io 容器注册表服务。通过点 Continue Tutorial 用户了解如何在 Quay.io 上执行以下功能:

  • 通过 Docker CLI 登录 Quay Container Registry
  • 启动容器
  • 从容器创建镜像
  • 将存储库推送到 Quay Container Registry
  • 查看软件仓库
  • 设置构建触发器
  • 更改存储库的权限

3.1.4. 有关 Quay.io 定价的信息

除了免费层外,Quay.io 还提供多种具有增强优势的付费计划。

Quay.io 定价 页面提供有关 Quay.io 计划以及每个计划的相关价格的信息。每个层的成本可在 定价 页面中找到。所有 Quay.io 计划都包括以下优点:

  • 持续集成
  • 公共软件仓库
  • 机器人帐户
  • 团队
  • SSL/TLS 加密
  • 日志记录和审计
  • 发票历史记录

Quay.io 订阅由 Stripe 支付处理平台处理。需要一个有效的信用卡才能注册 Quay.io。

要注册 Quay.io,请使用以下流程:

流程

  1. 导航到 Quay.io Pricing 页面
  2. 决定一个计划,如 Small,然后单击 Buy Now。您将被重定向到 Create New Organization 页面。输入以下信息:

    • 机构名称
    • 机构电子邮件
    • 可选。如果要更大的计划,您可以选择不同的计划,例如 Small
  3. 解析 captcha,然后选择 Create Organization
  4. 您将被重定向到 Stripe。输入以下信息:

    • 卡信息,包括 MM/YYCVC
    • 卡中的名称
    • 国家/地区
    • ZIP (如果适用)
    • 如果要保存信息,请选中该框。
    • 电话号码
  5. 填写完所有框后,单击 Subscribe

第 4 章 Red Hat Quay tenancy 模型

在创建仓库以在 Quay.io 中包含容器镜像之前,您应该考虑这些存储库是如何构建的。使用 Quay.io 时,每个存储库都需要与组织或用户 进行连接。 这种关系为存储库定义所有权和访问控制。

4.1. 租期模型

Tenancy model

  • 组织 提供了一种在不属于单个用户的通用命名空间下共享存储库的方法。相反,这些存储库属于共享设置中的多个用户,如公司。
  • 团队 为机构提供了一种委托权限的方法。权限可以在全局级别(例如,在所有仓库间)或特定存储库设置。也可以为特定集合或用户组设置它们。
  • 用户可以通过 Web UI 或 使用 Podman 等客户端并使用其相应的登录命令(例如 $ podman login )来登录 registry。如果您使用 Quay.io,每个用户都会自动获得一个用户命名空间,例如 & lt;quay-server.example.com>/<user>/<username &gt ; 或 quay.io/<username >。
  • 机器人帐户 为非人类用户(如管道工具)提供对存储库的自动化访问权限。机器人帐户与 OpenShift Container Platform 服务帐户类似。通过添加该帐户(如给另一个用户或团队),可以将权限授予存储库中的机器人帐户。

4.2. 登录到 Quay

Quay.io 的用户帐户表示具有对平台特性和功能验证访问权限的个人。通过此帐户,您可以获取创建和管理存储库、上传和检索容器镜像以及控制这些资源的访问权限的能力。此帐户用于整理和监督 Quay.io 中的容器镜像管理。

注意

并非所有 Quay.io 功能都要求用户登录。例如,您可以在不登录的情况下从 Quay.io 匿名拉取镜像,只要您要拉取的镜像来自公共存储库。

用户有两个选项可用于登录到 Quay.io:

  • 通过 Quay.io 登录。

    此选项为用户提供旧的 UI,以及用于使用 beta UI 环境的选项,该环境遵循 PatternFly UI 原则。

  • 通过 Red Hat Hybrid Cloud Console 登录。

    此选项使用 Red Hat SSO 进行身份验证,并且是由红帽提供的公共管理服务。这个选项 始终 要求用户登录。与其他托管服务一样,Red Hat Hybrid Cloud Console 上的 Quay 通过遵循 PatternFly UI 原则来增强用户体验。

Red Hat Hybrid Cloud Console 上使用 Quay.io 和 Quay 的不同是微不足道的,包括免费层上的用户。无论您是直接使用 Quay.io,在 Hybrid Cloud Console 上,需要登录的功能(如推送到存储库),请使用您的 Quay.io 用户名规格。

4.2.1. 登录到 Quay.io

使用以下步骤登录到 Quay.io。

先决条件

  • 您已创建了红帽帐户和一个 Quay.io 帐户。如需更多信息,请参阅"创建 Quay.io 帐户"。

流程

  1. 导航到 Quay.io
  2. 在导航窗格中,选择 Sign In 并使用您的红帽凭据登录。
  3. 如果是第一次登录时,您必须确认自动生成的用户名。单击 Confirm Username 以登录。

    您将被重定向到 Quay.io 存储库登录页面。

    Quay.io repository landing page

4.2.2. 通过 Hybrid Cloud 控制台登录到 Quay

先决条件

  • 您已创建了红帽帐户和一个 Quay.io 帐户。如需更多信息,请参阅"创建 Quay.io 帐户"。

流程

  1. 导航到 Red Hat Hybrid Cloud Console 上的 Quay,并使用您的红帽帐户登录。您将被重定向到 Quay 存储库登录页面:

    Quay on the Red Hat Hybrid Cloud Console

第 5 章 Quay.io 组织概述

in = Quay.io 是一个机构是一组用户、存储库和团队。它提供了一种方式来组织和管理 registry 中的访问控制和权限。通过机构,管理员可以为用户和团队分配角色和权限。有关机构的其他有用信息包括:

  • 您不能将一个机构嵌入到另一个机构中。要划分组织,请使用 team。
  • 机构无法直接包含用户。您必须首先添加一个团队,然后为每个团队添加一个或多个用户。

    注意

    单个用户可以添加到组织内的特定存储库中。因此,这些用户不是 Repository Settings 页面中的任何团队的成员。Teams and Memberships 页面上的 Collaborators View 显示有权直接访问该机构中特定存储库的用户,而无需特别成为该机构的一部分。

  • 团队可以被设置在机构中,就像使用存储库和相关镜像的成员一样,或者作为具有特殊特权来管理机构的管理员一样。

用户可以创建自己的组织来共享容器镜像的存储库。这可以通过 Quay.io UI 完成。

5.1. 使用 UI 创建机构

使用以下步骤使用 UI 创建新机构。

流程

  1. 登录到您的 Red Hat Quay registry。
  2. 在导航窗格中,单击 Organization
  3. 单击 Create Organization
  4. 输入 组织名称,如 testorg
  5. 输入 机构电子邮件
  6. Create

现在,您的示例组织应在 Organizations 页面下填充。

5.2. 机构设置

使用 = Quay.io 时,可以使用 UI 调整一些基本组织设置。这包括调整常规设置,如与机构关联的电子邮件地址以及 时间机器设置,供管理员在标签被永久删除后调整。

使用以下步骤使用 v2 UI 更改您的机构设置。

流程

  1. 在 v2 UI 上,单击 Organizations
  2. 单击您要为其创建机器人帐户的组织名称,如 test-org
  3. Settings 选项卡。
  4. 可选。输入与机构关联的电子邮件地址。
  5. 可选。将 Time Machine 功能的分配时间设置为以下之一:

    • 几秒钟
    • 一天
    • 7 天
    • 14 天
    • 一个月
  6. 点击 Save

第 6 章 Red Hat Quay 软件仓库概述

存储库为存储一组相关容器镜像提供了一个中央位置。这些镜像可用于以标准化格式构建应用程序及其依赖项。

存储库按命名空间进行组织。每个命名空间可以有多个存储库。例如,您可能具有个人项目的命名空间、一个用于公司的命名空间,或者对于您机构中的特定团队有一个命名空间。

通过付费计划,Quay.io 为用户提供其存储库的访问控制。用户可以将存储库变为公共存储库,即任何人都可以从存储库拉取或下载、镜像,或者用户可以使其私有,限制对授权用户或团队的访问权限。

注意

Quay.io 的空闲层不允许私有存储库。您必须升级到 Quay.io 的已支付层,以创建私有存储库。如需更多信息,请参阅"有关 Quay.io 定价的信息"。

在 Quay.io 中创建存储库的方法有两种:使用相关 podman 命令推送镜像,或使用 Quay.io UI。您还可以使用 UI 删除存储库。

如果您在 UI 上不先通过命令行界面(CLI)推送镜像,则不会将创建的存储库设置为 Private,无论您拥有的计划是什么。

注意

建议您在推送镜像前在 Quay.io UI 上创建存储库。Quay.io 检查计划状态,如果计划未激活,则不允许创建私有存储库。

6.1. 使用 UI 创建存储库

使用以下步骤使用 Quay.io UI 创建存储库。

流程

使用以下步骤使用 v2 UI 创建存储库。

流程

  1. 单击导航窗格上的 Repositories
  2. 单击 Create Repository
  3. 选择一个命名空间,如 quayadmin,然后输入 Repository name,如 testrepo

    重要

    不要在存储库名称中使用以下词语:* build * trigger * tag * notification

    当这些词语用于存储库名称时,用户无法访问存储库,且无法永久删除存储库。尝试删除这些仓库会返回以下错误: Failed to delete repository <repository_name>, HTTP404 - Not Found。

  4. Create

    现在,您的 example 存储库应该在 Repositories 页面中填充。

  5. 可选。点 SettingsRepository visibilityMake private 将存储库设置为私有。

6.2. 使用 Podman 创建软件仓库

使用正确的凭证,您可以使用 Quay.io 实例中尚不存在的 Podman 将镜像推送到 存储库。推送镜像指的是将容器镜像从本地系统或开发环境上传到容器 registry (如 Quay.io)的过程。将镜像推送到 registry 后,会创建一个存储库。如果您在 UI 上不先通过命令行界面(CLI)推送镜像,则所创建的存储库将设置为私有。

如果您在 UI 上不先通过命令行界面(CLI)推送镜像,则不会将创建的存储库设置为 Private,无论您拥有的计划是什么。

注意

建议您在推送镜像前在 Quay.io UI 上创建存储库。Quay.io 检查计划状态,如果计划未激活,则不允许创建私有存储库。

使用以下步骤通过推送镜像来创建镜像存储库。

先决条件

  • 您已下载并安装 podman CLI。
  • 已登录到 registry。
  • 您已拉取了镜像,如 busybox。

流程

  1. 从示例 registry 中拉取示例页面。例如:

    $ podman pull busybox
    Copy to Clipboard Toggle word wrap

    输出示例

    Trying to pull docker.io/library/busybox...
    Getting image source signatures
    Copying blob 4c892f00285e done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9
    Copy to Clipboard Toggle word wrap

  2. 使用新存储库和镜像名称标记本地系统上的镜像。例如:

    $ podman tag docker.io/library/busybox quay.io/quayadmin/busybox:test
    Copy to Clipboard Toggle word wrap
  3. 将镜像推送到 registry。在这一步后,您可以使用浏览器在存储库中查看标记的镜像。

    $ podman push --tls-verify=false quay.io/quayadmin/busybox:test
    Copy to Clipboard Toggle word wrap

    输出示例

    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    Copy to Clipboard Toggle word wrap

6.3. 使用 UI 删除存储库

您可以直接在 UI 上删除存储库。

先决条件

  • 您已创建了软件仓库。

流程

  1. 在 v2 UI 的 Repositories 页面上,选中您要删除的存储库的复选框,如 quayadmin/busybox
  2. Actions 下拉菜单。
  3. 点击 Delete
  4. 在框中键入 confirm,然后单击 Delete

    删除后,您将返回到 Repositories 页面。

6.4. 用户设置

User Settings 页面为用户提供了设置其电子邮件地址、密码、帐户类型、设置桌面通知、选择 avatar、删除帐户、调整 时间机器设置 以及查看账单信息的方法。

6.4.2. 调整用户设置

使用以下步骤调整用户设置。

流程

  • 要更改您的电子邮件地址,请为电子邮件地址选择当前 电子邮件地址。在弹出窗口中输入新电子邮件地址,然后单击 Change Email。在应用更改前,将发送验证电子邮件。
  • 若要更改密码,请单击" 更改密码 "。在两个框中输入新密码,然后单击 更改密码
  • 单击单个帐户 或 帐户类型 旁边的选项,更改 帐户类型。在某些情况下,您可能需要在更改帐户类型前保留机构。
  • 点击桌面通知旁边的选项来调整您的桌面 通知。用户可以启用或禁用此功能。
  • 您可以通过单击 Begin delete 来删除帐户。如果您有活跃的计划,或者您是唯一的管理员的机构的成员,则无法删除帐户。您必须通过输入命名空间来确认删除。

    重要

    删除帐户不可逆,将删除帐户的所有数据,包括存储库、创建构建触发器和通知。

  • 您可以通过单击 Time Machine 旁边的 drop-box 来设置 时间机器 功能。此功能指明标签被删除后的时间长度,即在收集垃圾回收前可在时间机器内访问该标签。选择时间后,单击 Save Expiration Time

6.4.3. 账单信息

您可以查看 用户设置 的账单信息。在这个部分中,提供了以下信息:

  • 当前计划.本节表示您注册的当前计划 Quay.io 计划。它还显示您拥有的私有存储库量。
  • 发票.如果您正处于付费计划,您可以点击 View Invoices 来查看发票列表。
  • 收据.如果您正处于付费计划,您可以选择是否收到您、其他用户或完全取消收据的付款邮件。

第 7 章 Red Hat Quay Robot 帐户概述

机器人帐户用于自动访问 Quay.io 注册表中的存储库。它们与 OpenShift Container Platform 服务帐户类似。

设置 Robot 帐户如下所示:

  • 生成与 Robot 帐户关联的凭据。
  • Robot 帐户可从中推送和拉取镜像的存储库和镜像将被识别。
  • 生成的凭据可以复制和粘贴以与不同的容器客户端一起使用,如 Docker、Podman、Kubernetes、Masos 等,以访问每个定义的存储库。

每个 Robot 帐户都仅限于单个用户命名空间或组织。例如,Robot 帐户可以提供用户 quayadmin 的所有存储库的访问权限。但是,它无法提供对不在用户存储库列表中的存储库的访问权限。

可以使用 Red Hat Quay UI 创建机器人帐户,也可以使用 Red Hat Quay API 通过 CLI 创建。创建后,Red Hat Quay 管理员可以利用 Robot Accounts 的更多高级功能,如无密钥身份验证。

7.1. 使用 UI 创建机器人帐户

使用以下步骤使用 v2 UI 创建机器人帐户。

流程

  1. 在 v2 UI 上,单击 Organizations
  2. 单击您要为其创建机器人帐户的组织名称,如 test-org
  3. Robot accounts 选项卡 → Create robot account
  4. Provide a name for your robot account 框中,输入名称,如 robot1。您的 Robot 帐户的名称是您的用户名与机器人的名称的组合,如 quayadmin+robot1
  5. 可选。如果需要,可以使用以下选项:

    1. 将机器人帐户添加到团队。
    2. 将机器人帐户添加到存储库。
    3. 调整机器人帐户的权限。
  6. Review and finish 页面中,检查您提供的信息,然后点 Review and finish。此时会出现以下警报: Successfully created robot account with robot name: <organization_name> + <robot_name>

    或者,如果您尝试创建名称与另一个机器人帐户相同的机器人帐户,您可能会收到以下出错信息: Error create robot account

  7. 可选。您可以单击 ExpandCollapse 来显示有关机器人帐户的描述性信息。
  8. 可选。您可以点击 kebab 菜单 → Set repository 权限来更改机器人帐户的权限。此时会出现以下信息: Successfully updated repository permission
  9. 可选。您可以点击机器人帐户的名称来获取以下信息:

    • 机器人帐户 :选择此项获取机器人令牌。您可以点 Regenerate token 来重新 生成令牌
    • Kubernetes Secret :选择此项以 Kubernetes pull secret YAML 文件的形式下载凭证。
    • Podman: 选择它复制包含凭据的完整 podman login 命令行。
    • Docker Configuration :选择此项复制包含凭据的完整 docker login 命令行。

7.2. 批量管理机器人帐户存储库访问权限

使用 Red Hat Quay v2 UI 管理批量、机器人帐户存储库访问权限。

先决条件

  • 您已创建了机器人帐户。
  • 您已在单个机构下创建多个软件仓库。

流程

  1. 在 Red Hat Quay v2 UI 登录页面上,单击导航窗格中的 Organizations
  2. Organizations 页面上,选择具有多个存储库的组织名称。单个机构下的存储库数量可在 Repo Count 列下找到。
  3. 在您的组织页面中,单击 Robot accounts
  4. 对于将添加到多个软件仓库中的机器人帐户,点 kebab 图标 → Set repository 权限
  5. Set repository permissions 页面上,选中机器人帐户要添加到的存储库的框。例如:

    Set repository permissions

  6. 设置机器人帐户的权限,例如 NoneReadWriteAdmin
  7. 单击保存。警告显示 Success alert: Successfully updated repository permission appears on Set repository permissions 页,确认更改。
  8. 返回到 OrganizationsRobot 帐户 页面。现在,机器人帐户的 Repositories 列会显示机器人帐户已添加到的存储库数量。

7.3. 禁用机器人帐户

Red Hat Quay 管理员可以禁止用户创建新的机器人帐户来管理机器人帐户。

重要

机器人帐户对于存储库镜像是必需的。将 ROBOTS_DISALLOW 配置字段设置为 True 会破坏镜像配置。用户镜像存储库不应在其 config.yaml 文件中将 ROBOTS_DISALLOW 设置为 True。这是一个已知问题,并将在以后的 Red Hat Quay 发行版本中解决。

使用以下步骤禁用机器人帐户创建。

先决条件

  • 您已创建了多个机器人帐户。

流程

  1. 更新 config.yaml 字段以添加 ROBOTS_DISALLOW 变量,例如:

    ROBOTS_DISALLOW: true
    Copy to Clipboard Toggle word wrap
  2. 重启 Red Hat Quay 部署。

验证:创建新的机器人帐户

  1. 导航到您的 Red Hat Quay 存储库。
  2. 点存储库的名称。
  3. 在导航窗格中,单击 Robot Accounts
  4. 单击 Create Robot Account
  5. 输入机器人帐户的名称,例如 < organization-name/username>+<robot-name >。
  6. 单击 Create robot account 以确认创建。此时会出现以下信息:Cannot create robot account。机器人帐户已被禁用。请联系您的管理员。

验证:登录到机器人帐户

  1. 在命令行界面(CLI)中,输入以下命令尝试作为机器人帐户登录:

    $ podman login -u="<organization-name/username>+<robot-name>" -p="KETJ6VN0WT8YLLNXUJJ4454ZI6TZJ98NV41OE02PC2IQXVXRFQ1EJ36V12345678" <quay-server.example.com>
    Copy to Clipboard Toggle word wrap

    返回以下出错信息:

    Error: logging into "<quay-server.example.com>": invalid username/password
    Copy to Clipboard Toggle word wrap
  2. 您可以传递 log-level=debug 标志,以确认机器人帐户已被停用:

    $ podman login -u="<organization-name/username>+<robot-name>" -p="KETJ6VN0WT8YLLNXUJJ4454ZI6TZJ98NV41OE02PC2IQXVXRFQ1EJ36V12345678" --log-level=debug <quay-server.example.com>
    Copy to Clipboard Toggle word wrap
    ...
    DEBU[0000] error logging into "quay-server.example.com": unable to retrieve auth token: invalid username/password: unauthorized: Robot accounts have been disabled. Please contact your administrator.
    Copy to Clipboard Toggle word wrap

7.4. 使用 UI 删除机器人帐户

使用以下步骤使用 Red Hat Quay UI 删除机器人帐户。

流程

  1. 登录到您的 Red Hat Quay registry:
  2. 单击具有机器人帐户的组织名称。
  3. 单击 Robot accounts
  4. 选中要删除的机器人帐户的框。
  5. 点 kebab 菜单。
  6. 点击 Delete
  7. 在文本框中键入 confirm,然后单击 Delete

7.5. 使用机器人帐户进行无密钥身份验证

在以前的 Red Hat Quay 版本中,机器人帐户令牌在令牌生命周期内有效,除非删除或重新生成。对于不想存储长期密码或管理删除、重新生成或新的身份验证令牌的用户,没有过期的令牌。

使用 Red Hat Quay 3 时,Red Hat Quay 管理员提供了与 Red Hat Single Sign-On (基于 Keycloak 项目)或 Microsoft Entra ID 交换外部 OIDC 令牌的功能。这允许机器人帐户利用上一小时的令牌,这些令牌定期刷新,并可用于验证单个事务。

此功能通过降低机器人令牌在一小时后删除令牌暴露的可能性,从而大大增强了 Red Hat Quay registry 的安全性。

使用机器人帐户配置无密钥身份验证是一个多步骤流程,需要设置机器人联合,从 OIDC 提供程序生成 OAuth2 令牌,并为机器人帐户访问令牌交换 OAuth2 令牌。

7.5.1. 使用 Red Hat Sign Sign-On 生成 OAuth2 令牌

以下流程演示了如何使用 Red Hat Single Sign-On 生成 OAuth2 令牌。根据您的 OIDC 供应商,这些步骤会有所不同。

流程

  1. 在 Red Hat Single Sign-On UI 中:

    1. Clients,然后是可以请求用户验证的应用程序或服务的名称。
    2. 在客户端的 Settings 页面中,确保设置或启用以下选项:

      • 客户端 ID
      • 有效的重定向 URI
      • 客户端身份验证
      • 授权
      • 标准流程
      • 直接访问授予

        注意

        根据您的设置,设置可能会有所不同。

    3. Credentials 页面中,存储 Client Secret 以备将来使用。
    4. Users 页面中,单击 Add user 并输入用户名,如 service-account-quaydev。然后,单击 Create
    5. 单击用户的名称,如 Users 页面上的 service-account-quaydev
    6. Credentials 标签页 → Set password →,为用户提供密码。如果保证,您可以通过选择 Temporary 选项使此密码临时化。
    7. Realm settings 选项卡 → OpenID Endpoint Configuration。存储 /protocol/openid-connect/token 端点。例如:

      http://localhost:8080/realms/master/protocol/openid-connect/token
      Copy to Clipboard Toggle word wrap
  2. 在网页浏览器中,导航到以下 URL:

    http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
    Copy to Clipboard Toggle word wrap
  3. 出现提示时,使用 service-account-quaydev 用户和您设置的临时密码登录。必要时,提供所需信息并设置永久密码,从而完成登录。
  4. 您将被重定向到为客户端提供的 URI 地址。例如:

    https://localhost:3000/cb?session_state=5c9bce22-6b85-4654-b716-e9bbb3e755bc&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Fmaster&code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
    Copy to Clipboard Toggle word wrap

    记录地址中提供的 代码。例如:

    code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
    Copy to Clipboard Toggle word wrap
    注意

    这是只能一次使用的临时代码。如果需要,您可以刷新页面或重新访问 URL 以获取另一个代码。

  5. 在终端中,使用以下 curl -X POST 命令来生成临时 OAuth2 访问令牌:

    $ curl -X POST "http://localhost:8080/realms/master/protocol/openid-connect/token" 
    1
    
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d "client_id=quaydev" 
    2
    
    -d "client_secret=g8gPsBLxVrLo2PjmZkYBdKvcB9C7fmBz" 
    3
    
    -d "grant_type=authorization_code"
    -d "code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43" 
    4
    Copy to Clipboard Toggle word wrap
    1
    在 Red Hat Single Sign-On UI 的 Realm settings 页面中找到的 protocol/openid-connect/token 端点。
    2
    用于此流程的客户端 ID。
    3
    客户端 ID 的客户端 Secret。
    4
    从重定向 URI 返回的代码。

    输出示例

    {"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...",
    "expires_in":60,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiNTBlZTVkMS05OTc1LTQwMzUtYjNkNy1lMWQ5ZTJmMjg0MTEifQ.oBDx6B3pUkXQO8m-M3hYE7v-w25ak6y70CQd5J8f5EuldhvTwpWrC1K7yOglvs09dQxtq8ont12rKIoCIi4WXw","token_type":"Bearer","not-before-policy":0,"session_state":"5c9bce22-6b85-4654-b716-e9bbb3e755bc","scope":"profile email"}
    Copy to Clipboard Toggle word wrap

  6. access_token 从上一步中存储,因为它将在以下流程中为 Red Hat Quay 机器人帐户令牌交换。

以下流程演示了如何使用 Red Hat Quay v2 UI 设置机器人帐户联合。此流程使用 Red Hat Single Sign-On,它基于 Keycloak 项目。这些步骤以及设置机器人帐户联邦的信息会根据 OIDC 供应商的不同而有所不同。

先决条件

  • 您已创建了一个机构。以下示例使用 fed_test
  • 您已创建了机器人帐户。以下示例使用 fest_test+robot1
  • 您已为 Red Hat Quay 部署配置了 OIDC。以下示例使用 Red Hat Single Sign-On。

流程

  1. 在 Red Hat Single Sign-On 主页中:

    1. 选择用于验证用于 Red Hat Quay 的适当域。存储签发者 URL,例如 https://keycloak-auth-realm.quayadmin.org/realms/quayrealm
    2. Users → 要与机器人帐户关联的用户名称进行身份验证。您必须使用生成 OAuth2 访问令牌时所用的同一用户帐户。
    3. Details 页面中,存储用户的 ID,例如 449e14f8-9ebeb5-4d59-a63e-b7a77c75f770

      注意

      此步骤中收集的信息会根据您的 OIDC 供应商的不同而有所不同。例如,在 Red Hat Single Sign-On 中,用户的 ID 用作 Subject 来在后续步骤中设置机器人帐户联合。对于不同的 OIDC 供应商,如 Microsoft Entra ID,此信息存储为 主题

  2. 在 Red Hat Quay registry 中:

    1. 导航到 Organizations,再单击组织的名称,例如 fed_test
    2. 单击 Robot Accounts
    3. 点菜单 kebab → Set robot federation
    4. + 符号。
    5. 在弹出窗口中包括以下信息:

      • 签发者 URL:https://keycloak-auth-realm.quayadmin.org/realms/quayrealm.对于 Red Hat Single Sign-On,这是 Red Hat Single Sign-On 域的 URL。这根据您的 OIDC 供应商可能会有所不同。
      • 主题:449e14f8-9eb5-4d59-a63e-b7a77c75f770.对于 Red Hat Single Sign-On,主题 是 Red Hat Single Sign-On 用户的 ID。这根据您的 OIDC 供应商的不同而有所不同。例如,如果您使用 Microsoft Entra ID,则 主题 将是 主题 或您的 Entra ID 用户。
    6. 点击 Save

以下流程利用 上一步中生成的访问令牌 来创建新的 Red Hat Quay 机器人帐户令牌。新的 Red Hat Quay 机器人帐户令牌用于您的 OIDC 供应商和 Red Hat Quay 间的身份验证。

注意

以下示例使用 Python 脚本为 Red Hat Quay 机器人令牌交换 OAuth2 访问令牌。

先决条件

  • 已安装 python3 CLI 工具。

流程

  1. 将以下 Python 脚本保存到 .py 文件中,如 robot_fed_token_auth.py

    import requests
    import os
    
    TOKEN=os.environ.get('TOKEN')
    robot_user = "fed-test+robot1"
    
    def get_quay_robot_token(fed_token):
        URL = "https://<quay-server.example.com>/oauth2/federation/robot/token"
        response = requests.get(URL, auth=(robot_user,fed_token)) 
    1
    
        print(response)
        print(response.text)
    
    if __name__ == "__main__":
        get_quay_robot_token(TOKEN)
    Copy to Clipboard Toggle word wrap
    1
    如果您的 Red Hat Quay 部署使用自定义 SSL/TLS 证书,则响应必须是 response = requests.get (URL,auth=(robot_user,fed_token),verify=False),其中包括 verify=False 标志。
  2. 将 OAuth2 访问令牌导出为 TOKEN。例如:

    $ export TOKEN = eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...
    Copy to Clipboard Toggle word wrap
  3. 输入以下命令运行 robot_fed_token_auth.py 脚本:

    $ python3 robot_fed_token_auth.py
    Copy to Clipboard Toggle word wrap

    输出示例

    <Response [200]>
    {"token": "string..."}
    Copy to Clipboard Toggle word wrap

    重要

    此令牌在一小时后过期。一小时后,必须生成新的令牌。

  4. 将机器人帐户访问令牌导出为 QUAY_TOKEN。例如:

    $ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ
    Copy to Clipboard Toggle word wrap

7.5.4. 推送和拉取镜像

在生成了新的机器人帐户访问令牌并导出后,您可以使用访问令牌登录和机器人帐户,并推送和拉取镜像。

先决条件

  • 您已将 OAuth2 访问令牌导出到新的机器人帐户访问令牌。

流程

  1. 使用 fest_test+robot1 机器人帐户和 QUAY_TOKEN 访问令牌登录到您的 Red Hat Quay registry。例如:

    $ podman login <quay-server.example.com> -u fed_test+robot1 -p $QUAY_TOKEN
    Copy to Clipboard Toggle word wrap
  2. 从机器人帐户具有正确权限的 Red Hat Quay 存储库拉取镜像。例如:

    $ podman pull <quay-server.example.com/<repository_name>/<image_name>>
    Copy to Clipboard Toggle word wrap

    输出示例

    Getting image source signatures
    Copying blob 900e6061671b done
    Copying config 8135583d97 done
    Writing manifest to image destination
    Storing signatures
    8135583d97feb82398909c9c97607159e6db2c4ca2c885c0b8f590ee0f9fe90d
    0.57user 0.11system 0:00.99elapsed 68%CPU (0avgtext+0avgdata 78716maxresident)k
    800inputs+15424outputs (18major+6528minor)pagefaults 0swaps
    Copy to Clipboard Toggle word wrap

  3. 尝试从机器人帐户没有适当权限的 Red Hat Quay 存储库中拉取镜像。例如:

    $ podman pull <quay-server.example.com/<different_repository_name>/<image_name>>
    Copy to Clipboard Toggle word wrap

    输出示例

    Error: initializing source docker://quay-server.example.com/example_repository/busybox:latest: reading manifest in quay-server.example.com/example_repository/busybox: unauthorized: access to the requested resource is not authorized
    Copy to Clipboard Toggle word wrap

    一小时后,机器人帐户的凭据被设为过期。之后,您必须为此机器人帐户生成新的访问令牌。

第 8 章 访问 Red Hat Quay 管理

作为 Quay.io 用户,您可以创建自己的存储库,并使其可以被属于您的实例的其他用户访问。或者,您可以创建组织,并将一组存储库直接关联到该组织,称为 组织存储库

机构存储库与基本存储库不同,组织旨在通过用户组设置共享存储库。在 Quay.io 中,用户组可以是 团队,也可以是具有相同权限的用户集合,也可以是 单独的用户。您还可以通过创建与 Robot Accounts 关联的凭证来访问用户存储库和组织存储库。机器人帐户使得各种容器客户端(如 Docker 或 Podman)很容易访问您的存储库,而无需客户端具有 Quay.io 用户帐户。

8.1. Red Hat Quay 团队概述

在 Red Hat Quay 中,团队 是一组具有共享权限的用户,允许对项目进行高效管理和协作。团队可帮助简化机构和存储库内的访问控制和项目管理。可以为他们分配指定权限,帮助确保成员根据其角色和职责具有合适的存储库访问权限。

8.1.1. 使用 UI 创建团队

当您为您的机构创建团队时,您可以选择团队名称,选择要提供给团队的存储库,并决定团队的访问级别。

使用以下步骤为您的机构存储库创建团队。

先决条件

  • 您已创建了一个机构。

流程

  1. 在 Red Hat Quay v2 UI 上,点机构的名称。
  2. 在您的组织页面中,单击 Teams 和 membership
  3. Create new team 框。
  4. Create team 弹出窗口中,为您的新团队提供一个名称。
  5. 可选。为您的新团队提供描述。
  6. 单击 Proceed。此时会出现一个新的弹出窗口。
  7. 可选。将此团队添加到存储库中,并将权限设置为以下之一:

    • None。团队成员对存储库没有权限。
    • 读取.团队成员可以从存储库查看和拉取。
    • 写入。团队成员可以从中读取(拉取)并写入(推送)到存储库。
    • 管理.从存储库拉取(pull)和推送到存储库的完整访问权限以及执行与存储库关联的管理任务的能力。
  8. 可选。添加团队成员或机器人帐户。要添加团队成员,请输入其 Red Hat Quay 帐户的名称。
  9. 检查并完成信息,然后点 Review and Finish。新团队会出现在 团队和成员资格页面 下。

8.1.2. 使用 UI 管理团队

创建团队后,您可以使用 UI 管理团队成员、设置存储库权限、删除团队或查看有关团队的常规信息。

8.1.2.1. 使用 UI 将用户添加到团队

使用组织的管理特权,您可以在团队中添加用户和机器人帐户。添加用户时,Quay.io 会向该用户发送电子邮件。用户保持待定,直到他们接受邀请。

使用以下步骤将用户或机器人帐户添加到团队中。

流程

  1. 在 Red Hat Quay 登录页面中,点击您的机构的名称。
  2. 在导航窗格中,单击 Teams 和 Membership
  3. 选择您要将用户添加到的团队中的菜单 kebab。然后,单击 Manage team members
  4. 单击 Add new member
  5. 在文本框中输入以下信息:

    • 来自 registry 帐户的用户名。
    • registry 中用户帐户的电子邮件地址。
    • 机器人帐户的名称。名称必须采用 <organization_name>+<robot_name> 的形式。

      注意

      机器人帐户会立即添加到团队。对于用户帐户,加入的邀请由用户发送。在用户接受该邀请之前,用户会一直处于 INVITED TO JOIN 状态。用户接受加入团队的电子邮件邀请后,他们会从 INVITED TO JOIN 列表移到机构的 MEMBERS 列表。

  6. 单击添加成员
8.1.2.2. 使用 UI 设置团队角色

创建团队后,您可以在机构中设置该团队的角色。

先决条件

  • 您已创建了一个团队。

流程

  1. 在 Red Hat Quay 登录页面中,点击您的机构的名称。
  2. 在导航窗格中,单击 Teams 和 Membership
  3. 选择 TEAM ROLE 下拉菜单,如下图所示:

    Set the role that a team has within an organization

  4. 对于所选团队,请选择以下角色之一:

    • 管理.对组织的完全管理访问权限,包括创建团队、添加成员和设置权限的能力。
    • 成员 :继承为团队设置的所有权限。
    • 创建者.所有成员权限,以及创建新存储库的功能。
8.1.2.2.1. 管理团队成员和存储库权限

使用以下步骤管理团队成员和设置存储库权限。

  • 在机构的 团队和成员资格 页面中,您还可以管理团队成员并设置存储库权限。

    • 点 kebab 菜单,然后选择以下选项之一:
    • 管理团队成员。在此页面上,您可以查看所有成员、团队成员、机器人帐户或被邀请的用户。您还可以通过单击 Add new member 来添加新的团队成员。
    • 设置存储库权限。在这个页面中,您可以将存储库权限设置为以下之一:

      • None。团队成员对存储库没有权限。
      • 读取.团队成员可以从存储库查看和拉取。
      • 写入。团队成员可以从中读取(拉取)并写入(推送)到存储库。
      • 管理.从存储库拉取(pull)和推送到存储库的完整访问权限以及执行与存储库关联的管理任务的能力。
    • 删除。此弹出窗口允许您单击 Delete 来删除团队。
8.1.2.2.2. 查看团队的附加信息

使用以下步骤查看有关团队的一般信息。

流程

  • 在机构的 Teams 和 membership 页面中,您可以点击以下选项之一来显示团队、成员和协作器的更多信息:

    • 团队查看.此菜单显示所有团队名称、成员数量、存储库数量和每个团队的角色。
    • 成员查看.此菜单显示团队成员的所有用户名,即用户的存储库权限团队。
    • collaborators View.此菜单显示存储库协作器。collaborators 是不属于该机构中的任何团队的用户,但对属于该组织的一个或多个存储库具有直接权限。

8.1.3. 使用 Red Hat Quay API 管理团队

创建团队后,您可以使用 API 来获取有关团队权限或团队成员、添加、更新或删除团队成员(包括电子邮件)的信息,或删除机构团队。

以下流程演示了如何使用 Red Hat Quay API 管理团队。

8.1.3.1. 使用 API 设置机构中团队的角色

使用以下步骤使用 API 查看和设置团队。

先决条件

流程

  1. 输入以下 GET /api/v1/organization/{orgname}/team/{teamname}/permissions 命令,为机构的团队返回存储库权限列表。请注意,您的团队必须已添加到存储库中才能返回信息。

    $ curl -X GET \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/permissions"
    Copy to Clipboard Toggle word wrap

    输出示例

    {"permissions": [{"repository": {"name": "api-repo", "is_public": true}, "role": "admin"}]}
    Copy to Clipboard Toggle word wrap

  2. 您可以使用 PUT /api/v1/organization/{orgname}/team/{teamname} 命令,在组织内创建或更新团队,使其具有 adminmembercreator 角色。例如:

    $ curl -X PUT \
      -H "Authorization: Bearer <your_access_token>" \
      -H "Content-Type: application/json" \
      -d '{
        "role": "<role>"
      }' \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>"
    Copy to Clipboard Toggle word wrap

    输出示例

    {"name": "testteam", "description": "", "can_view": true, "role": "creator", "avatar": {"name": "testteam", "hash": "827f8c5762148d7e85402495b126e0a18b9b168170416ed04b49aae551099dc8", "color": "#ff7f0e", "kind": "team"}, "new_team": false}
    Copy to Clipboard Toggle word wrap

8.2. 使用 UI 创建和管理默认权限

默认权限定义在创建时应自动授予存储库的权限,除了存储库的默认创建者之外。权限根据创建存储库的用户分配。

使用以下步骤使用 Red Hat Quay v2 UI 创建默认权限。

流程

  1. 点机构的名称。
  2. 单击 Default permissions
  3. 单击 Create default permissions。此时会出现 toggle drawer。
  4. 选择 AnyoneSpecific 用户,以在创建存储库时创建默认权限。

    1. 如果选择 Anyone,则必须提供以下信息:

      • 应用到。搜索、邀请或添加用户/机器人/团队。
      • 权限.将权限设置为 ReadWriteAdmin 之一。
    2. 如果选择特定用户,则必须提供以下信息:

      • 存储库创建者.提供用户或机器人帐户。
      • 应用到。提供用户名、机器人帐户或团队名称。
      • 权限.将权限设置为 ReadWriteAdmin 之一。
  5. Create default permission。此时会出现确认框,返回以下警报: Successfully created default permissions for creator.

8.3. 使用 UI 调整存储库的访问设置

使用以下步骤,使用 v2 UI 调整存储库的用户或机器人帐户的访问设置。

先决条件

  • 您已创建了用户帐户或机器人帐户。

流程

  1. 登录到 Quay.io。
  2. 在 v2 UI 上,单击 Repositories
  3. 单击存储库的名称,如 quayadmin/busybox
  4. Settings 选项卡。
  5. 可选。单击 User and robot permissions。您可以通过单击 权限 下的下拉菜单选项来调整用户或机器人帐户的设置。您可以将设置更改为 ReadWriteAdmin

    • 读取.用户或 Robot 帐户可以从存储库查看和拉取。
    • 写入。用户或 Robot 帐户可以从中读取(提取)并将其写入(推送)到存储库。
    • 管理.用户或 Robot 帐户有权访问从存储库拉取并推送到存储库,以及执行与存储库关联的管理任务。

第 9 章 镜像标签概述

镜像标签 指的是分配给特定版本或容器镜像变体的标签或标识符。容器镜像通常由代表镜像不同部分的多个层组成。镜像标签用于区分镜像的不同版本或提供有关镜像的附加信息。

镜像标签具有以下优点:

  • 版本和发布 :通过镜像标签,您可以表示应用程序或软件的不同版本或版本。例如,您可能有一个标记为 v1.0 的镜像,以代表更新版本的初始发行版本和 v1.1。这有助于维护镜像版本的清晰记录。
  • 回滚和测试 :如果您遇到新镜像版本的问题,您可以通过指定标签来轻松恢复到以前的版本。这在调试和测试阶段非常有用。
  • 开发环境 :在使用不同环境时镜像标签很有用。您可以使用 dev 标签进行开发版本,qa 用于质量保证测试,以及生产环境的 prod,每个标签都有自己的功能和配置。
  • 持续集成/持续部署(CI/CD) :CI/CD 管道通常使用镜像标签来自动化部署过程。新的代码更改可触发使用特定标签创建新镜像,从而实现无缝更新。
  • 功能分支 :当多个开发人员处理不同的功能或程序错误修复时,他们可以为更改创建不同的镜像标签。这有助于隔离和测试各个功能。
  • 自定义 :您可以使用镜像标签来自定义具有不同配置、依赖项或优化的镜像,同时跟踪每个变体。
  • 安全和补丁 :发现安全漏洞时,您可以使用更新标签创建镜像的补丁版本,以确保您的系统使用最新的安全版本。
  • Dockerfile 更改 :如果修改 Dockerfile 或构建过程,您可以使用镜像标签来区分从之前和更新的 Dockerfile 构建的镜像。

总体而言,镜像标签提供了一种结构化的方式来管理和组织容器镜像,实现高效开发、部署和维护工作流。

9.1. 使用 UI 查看镜像标签信息

使用以下步骤使用 v2 UI 查看镜像标签信息。

先决条件

  • 您已将镜像标签推送到存储库。

流程

  1. 在 v2 UI 上,单击 Repositories
  2. 点存储库的名称。
  3. 点标签的名称。您会进入该标签的 Details 页面。该页面显示以下信息:

    • Name
    • 软件仓库
    • 摘要
    • 安全漏洞
    • 创建
    • 修改
    • Size
    • 标签
    • 如何获取镜像标签
  4. Security Report 查看标签的漏洞。您可以扩展公告列来打开 CVE 数据。
  5. Packages 查看标签的软件包。
  6. 单击存储库的名称,以返回到 Tags 页面。

9.2. 使用 UI 将新镜像标签添加到镜像

您可以向 Quay.io 中的镜像添加新标签。

流程

  1. 在 Red Hat Quay v2 UI 仪表板上,单击导航窗格中的 Repositories
  2. 单击具有镜像标签的存储库的名称。
  3. 单击菜单 kebab,然后单击 Add new tag
  4. 输入标签的名称,然后单击 Create tag

    新标签现在列在 Repository Tags 页面上。

9.3. 使用 UI 添加和管理标签

管理员可以使用以下流程为标签添加和管理标签。

流程

  1. 在 v2 UI 控制面板上,单击导航窗格中的 Repositories
  2. 单击具有镜像标签的存储库的名称。
  3. 点镜像菜单 kebab,然后选择 Edit labels
  4. Edit labels 窗口中,单击 Add new label
  5. 使用 key=value 格式输入镜像标签的标签,例如 com.example.release-date=2023-11-14

    注意

    当无法使用 key=value 格式时返回以下错误: Invalid label format, must be key value by =.

  6. 单击框的空格以添加标签。
  7. 可选。添加第二个标签。
  8. Save labels 将标签保存到镜像标签。返回以下通知: 成功创建标签
  9. 可选。点击标签上的同一镜像标签菜单 kebab → Edit labelsX 将其删除;或者,您可以编辑文本。点 Save labels。现在,标签已被删除或编辑。

9.4. 设置标签过期

可以使用标签过期功能,将镜像标签设置为在所选日期和时间从 Quay.io 存储库 过期。此功能包括以下特征:

  • 当镜像标签过期时,它将从存储库中删除。如果这是特定镜像的最后一个标签,则镜像也会设置为被删除。
  • 过期会根据每个标签设置。对于整个仓库,没有设置它。
  • 标签过期或删除后,它不会立即从 registry 中删除。这取决于在时间 机器功能中设计的分配时间,该功能定义何时永久删除标签或垃圾收集。默认情况下,这个值设置为 14 天,但管理员可以将此时间调整为多个选项之一。在进行垃圾回收前,可以恢复标签更改。

标签过期时间可以通过三种方式之一设置:

  • 在创建镜像时,通过在 Dockerfile 中设置 quay.expires-after= 标签。这会将一个时间设置为在构建镜像时过期。该标签仅适用于镜像清单。
  • 在创建镜像时,通过在 Dockerfile 中设置 quay.expires-after= 注解标签。可以为镜像清单和镜像索引传递 --annotation
  • 通过选择 Quay.io UI 上的过期日期。例如:

    Change tag expiration under the Options icon or from the EXPIRES column

设置标签过期可帮助自动清理旧的或未使用的标签,有助于减少存储空间。

9.4.1. 从存储库设置标签过期

流程

  1. 在 Red Hat Quay v2 UI 仪表板上,单击导航窗格中的 Repositories
  2. 单击具有镜像标签的存储库的名称。
  3. 点镜像菜单 kebab 并选择 Change expiration
  4. 可选。或者,您可以通过点多个标签框来批量添加过期日期,然后选择 ActionsSet expiration
  5. Change Tags Expiration 窗口中,设置一个到期日期,指定星期几、月份、月份和年份。例如,2023 年 11 月 15 日星期三。或者,您可以点击日历按钮并手动选择日期。
  6. 设置时间,例如 2:30 PM
  7. 单击 Change Expiration 以确认日期和时间。返回以下通知:成功将 标签测试的过期时间设置为 2023 年 11 月 15 日,2:26 PM
  8. 在 Red Hat Quay v2 UI Tags 页面中,您可以看到标签设置为过期。例如:

    Red Hat Quay v2 UI tag expiration

9.4.2. 从 Dockerfile 设置标签过期

您可以使用 docker label 命令将标签(例如 quay.expires-after=20h )添加到镜像标签中,以便标签在指示的时间后自动过期。可接受小时、天或周的以下值:

  • 1h
  • 2d
  • 3w

过期时间从镜像推送到 registry 的时间开始。

流程

  • 输入以下 docker label 命令,为所需的镜像标签添加标签。标签的格式应为 quay.expires-after=20h,以指示该标签应当在 20 小时后过期。使用所需的过期时间替换 20h。例如:

    $ docker label quay.expires-after=20h quay-server.example.com/quayadmin/<image>:<tag>
    Copy to Clipboard Toggle word wrap

9.4.3. 使用注解设置标签过期

您可以在将镜像推送到 registry 时,将注解(如 quay.expires-after=20h )添加到镜像标签中。此注解会导致标签在指定时间后自动过期。该注解可同时应用到镜像清单和镜像索引。可接受小时、天或周的以下值:

  • 1h
  • 2d
  • 3w

过期时间从镜像推送到 registry 的时间开始。

注意

使用 or- annotation 标志可以通过 oras CLI 工具最简单的。

先决条件

流程

  1. 输入以下 oras push --annotation 命令,将注解添加到所需的镜像标签。该注解应该采用 quay.expires-after=<value> 格式,以指示该标签应该使集合时间过期。例如:

    $ oras push --annotation quay.expires-after=<value> \
      <quay-server.example.com>/<organization>/<repository>:<tag> \
      <file_path>:<media_type>
    Copy to Clipboard Toggle word wrap

    输出示例

    ✓ Uploaded  hello.txt                                                                                                       12/12  B 100.00%  321ms
      └─ sha256:74b9e308133afb3bceae961097cb2aa481483869d695ce1414cd2bc7f046027c
    ✓ Uploaded  application/vnd.oci.empty.v1+json                                                                                 2/2  B 100.00%  328ms
      └─ sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
    ✓ Uploaded  application/vnd.oci.image.manifest.v1+json                                                                    620/620  B 100.00%     0s
      └─ sha256:c370e931b5eca44fd753bd92e6991ed3be70008e8df15078083359409111f8c3
    Pushed [registry] quay-server.example.com/fortestuser/busybox:test2
    ArtifactType: application/vnd.unknown.artifact.v1
    Copy to Clipboard Toggle word wrap

  2. 通过检查 Red Hat Quay UI 或输入以下命令来确认已应用了过期日期:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/?specificTag=<tag>" \
    Copy to Clipboard Toggle word wrap

    输出示例

    {"tags": [{"name": "test2", "reversion": false, "start_ts": 1743706344, "end_ts": 1743778344, "manifest_digest": "sha256:c370e931b5eca44fd753bd92e6991ed3be70008e8df15078083359409111f8c3", "is_manifest_list": false, "size": 12, "last_modified": "Thu, 03 Apr 2025 18:52:24 -0000", "expiration": "Fri, 04 Apr 2025 14:52:24 -0000"}, {"name": "test2", "reversion": false, "start_ts": 1742493776, "end_ts": 1743706344, "manifest_digest": "sha256:d80aa3d7f5f5388cfae543b990d3cd3d47ff51c48ef29ff66102427bf7bc0a88", "is_manifest_list": false, "size": 2266046, "last_modified": "Thu, 20 Mar 2025 18:02:56 -0000", "expiration": "Thu, 03 Apr 2025 18:52:24 -0000"}], "page": 1, "has_additional": false}
    Copy to Clipboard Toggle word wrap

9.4.4. 使用注解删除标签过期

使用 oras CLI 工具,您可以取消设置之前建立的过期时间。

先决条件

流程

  1. 输入以下 oras push --annotation 命令删除所需镜像标签的注释。该注解的格式应为 quay.expires-after=never。例如:

    $ oras push --annotation quay.expires-after=never \
      <quay-server.example.com>/<organization>/<repository>:<tag> \
      <file_path>:<media_type>
    Copy to Clipboard Toggle word wrap

    输出示例

    ✓ Uploaded  hello.txt                                                                                                       12/12  B 100.00%  321ms
      └─ sha256:74b9e308133afb3bceae961097cb2aa481483869d695ce1414cd2bc7f046027c
    ✓ Uploaded  application/vnd.oci.empty.v1+json                                                                                 2/2  B 100.00%  328ms
      └─ sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
    ✓ Uploaded  application/vnd.oci.image.manifest.v1+json                                                                    620/620  B 100.00%     0s
      └─ sha256:c370e931b5eca44fd753bd92e6991ed3be70008e8df15078083359409111f8c3
    Pushed [registry] quay-server.example.com/fortestuser/busybox:test2
    ArtifactType: application/vnd.unknown.artifact.v1
    Copy to Clipboard Toggle word wrap

  2. 最新清单将不再有过期时间。通过检查 Red Hat Quay UI 或输入以下命令来确认已删除过期日期:

    {"tags": [{"name": "test2", "reversion": false, "start_ts": 1743708135, "manifest_digest": "sha256:19e3a3501b4125cce9cb6bb26ac9207c325259bef94dc66490b999f93c4c83a9", "is_manifest_list": false, "size": 12, "last_modified": "Thu, 03 Apr 2025 19:22:15 -0000"}, {"name": "test2", "reversion": false, "start_ts": 1743706344, "end_ts": 1743708135}]}
    Copy to Clipboard Toggle word wrap

    请注意,没有列出过期时间。

9.5. 通过标签或摘要获取镜像

Quay.io 提供多种使用 Docker 和 Podman 客户端拉取镜像的方法。

流程

  1. 导航到存储库的 Tags 页面。
  2. 清单 下,单击 Fetch Tag 图标。
  3. 当弹出框出现时,用户会看到以下选项:

    • Podman Pull (通过标签)
    • Docker Pull (通过标签)
    • Podman Pull (按摘要)
    • Docker Pull (按摘要)

      选择任何四个选项可返回相应客户端的命令,供用户拉取(pull)镜像。

  4. Copy Command 复制命令,该命令可用于命令行界面(CLI)。例如:

    $ podman pull quay.io/quayadmin/busybox:test2
    Copy to Clipboard Toggle word wrap

9.6. 使用 UI 查看 Red Hat Quay 标签历史记录

Quay.io 提供镜像及其对应镜像标签的全面历史记录。

流程

  1. 在 Red Hat Quay v2 UI 仪表板上,单击导航窗格中的 Repositories
  2. 单击具有镜像标签的存储库的名称。
  3. 单击 Tag History。在这个页面中,您可以执行以下操作:

    • 按标签名称搜索
    • 选择一个日期范围
    • 查看标签更改
    • 查看标签修改日期以及更改的时间

9.7. 删除镜像标签

删除镜像标签会从 registry 中移除镜像的特定版本。

要删除镜像标签,请使用以下步骤。

流程

  1. 在 v2 UI 的 Repositories 页面上,单击您要删除的镜像的名称,如 quay/admin/busybox
  2. More Actions 下拉菜单。
  3. Delete

    注意

    如果需要,您可以单击 Make PublicMake Private

  4. 在框中键入 confirm,然后单击 Delete
  5. 删除后,您将返回到 Repositories 页面。

    注意

    根据分配给 时间机器 功能分配的时间,可以恢复删除镜像标签。如需更多信息,请参阅"恢复标签更改"。

9.8. 使用 UI 恢复标签更改

Quay.io 提供了全面的 时间机器 功能,允许旧镜像标签在存储库中保留,以便可以恢复对标签所做的更改。此功能允许用户恢复标签更改,如标签删除。

流程

  1. 在 v2 UI 的 Repositories 页面上,单击您要恢复的镜像的名称。
  2. 单击 Tag History 选项卡。
  3. 在镜像标签被更改或删除的时间表中找到点。接下来,单击 Revert 下的选项,将标签恢复到其镜像。

第 10 章 查看和导出日志

为 Quay.io 中的所有存储库和命名空间收集活动日志。

查看 Quay.io 的使用日志可为操作和安全目的提供宝贵见解和优势。使用日志可能会显示以下信息:

  • 资源规划 :使用日志可在镜像拉取、推送和您的 registry 整个流量数量上提供数据。
  • 用户活动 :日志可帮助您跟踪用户活动,显示哪些用户正在访问并与 registry 中的镜像交互。这对审计、了解用户行为和管理访问控制非常有用。
  • 使用模式 :通过研究使用情况模式,您可以深入了解哪些镜像被常见,使用哪些版本,以及很少访问哪些镜像。这些信息可帮助对镜像维护和清理工作进行优先排序。
  • 安全审计 :使用日志可让您跟踪谁正在访问镜像以及时间。这对安全审计、合规性以及调查任何未授权或可疑活动至关重要。
  • Image Lifecycle Management: Logs 可以显示哪些镜像被拉取、推送和删除。此信息对于管理镜像生命周期至关重要,包括弃用旧镜像并确保只使用授权的镜像。
  • 合规性 和规范要求 :许多行业具有规定跟踪和审核对敏感资源的访问权限的合规性要求。使用日志可帮助您演示遵守此类法规。
  • 识别异常行为 :使用 日志中异常或异常模式可以指示潜在的安全漏洞或恶意活动。监控这些日志可帮助您更有效地检测和响应安全事件。
  • 趋势分析 :随着时间的推移,使用日志可以提供趋势并深入了解您的 registry 的使用方式。这有助于您就资源分配、访问控制和镜像管理策略做出明智的决策。

访问日志文件的方法有多种:

  • 通过 Web UI 查看日志.
  • 导出日志以便可以在外部保存它们。
  • 使用 API 访问日志条目。

要访问日志,您必须具有所选存储库或命名空间的管理权限。

注意

通过 API 最多提供 100 个日志结果。要收集更多结果,您必须使用本章中描述的日志导出器功能。

10.1. 查看使用日志

日志可以提供关于使用 registry 的方法的宝贵信息。可以按照以下流程在 v2 UI 上的机构、存储库或命名空间查看日志。

流程

  1. 登录到您的 Red Hat Quay registry。
  2. 导航到您作为管理员的机构、存储库或命名空间。
  3. Logs

    Logs page

  4. 可选。通过向 FromTo box 添加日期来设置查看日志条目的日期范围。
  5. 可选。单击导出,以导出日志。您必须输入一个电子邮件地址或以 http://https:// 开头的有效回调 URL。这个过程可能需要一小时,具体取决于存在的日志数量。

10.2. 使用 UI 导出存储库日志

您可以使用 Export Logs 功能获取大量日志文件,并将它们保存到 Quay.io 之外。这个功能有以下优点和限制:

  • 您可以为您要从存储库收集的日志选择日期范围。
  • 您可以通过电子邮件附加或定向到回调 URL 来请求日志发送到您。
  • 要导出日志,您必须是存储库或命名空间的管理员。
  • 为所有用户保留 30 天的日志。
  • 导出日志仅收集之前生成的日志数据。它不流传输日志记录数据。
  • 当日志被收集并供您使用时,如果想要保存该数据,应该立即复制这些数据。默认情况下,数据在一小时后过期。

使用以下步骤导出日志。

流程

  1. 选择具有管理员特权的存储库。
  2. Logs 选项卡。
  3. 可选。如果要指定特定的日期,请在 Fromto 框中输入范围。
  4. Export Logs 按钮。此时会出现 Export Usage Logs 弹出窗口,如下所示

    Enter email or callback URL to receive exported logs

  5. 输入电子邮件地址或回调 URL 以接收导出的日志。对于回调 URL,您可以使用一个指定域的 URL,例如 <webhook.site>。
  6. 选择 Confirm 以开始收集所选日志条目的流程。根据要收集的日志记录数据量,这可能需要任何几分钟到几分钟才能完成。
  7. 日志导出完成后,会出现以下两个事件之一:

    • 会收到一封电子邮件,提醒您请求的导出日志条目可用。
    • 从 Webhook URL 返回日志导出请求的成功状态。另外,还会提供一个到导出的数据的链接,供您删除以下载日志。

第 11 章 Clair 安全扫描程序

Clair v4 (Clair)是一个开源应用,它利用静态代码分析来解析镜像内容并报告影响内容的漏洞。Clair 与 Quay.io 打包,被自动启用,并由 Red Hat Quay 开发团队管理。

对于 Quay.io 用户,镜像会在镜像推送到存储库后自动进行索引。然后,会从 Clair 获取报告,该镜像与其 CVE 的数据库匹配,以报告安全信息。此过程会在 Quay.io 上自动进行,不需要手动重新设置。

11.1. 关于 Clair

Clair 使用国家漏洞数据库(NVD)中的常见漏洞评分系统(CVSS)数据功能丰富的漏洞数据,这是与安全相关的信息,包括各种软件组件和系统中的已知漏洞和安全问题。使用 NVD 中的分数为 Clair 提供以下优点:

  • 数据同步.Clair 可以定期将其漏洞数据库与 NVD 同步。这样可确保它具有最新的漏洞数据。
  • 匹配并增强.Clair 将容器镜像中发现的漏洞的元数据和标识符与 NVD 中的数据进行比较。这个过程涉及将唯一标识符(如常见漏洞和暴露(CVE) ID)与 NVD 中的条目匹配。找到匹配项时,Clair 可以通过来自 NVD 的额外详情来增强其漏洞信息,如严重性分数、描述和引用。
  • 严重性分数.NVD 为漏洞分配严重性分数,如通用漏洞评分系统(CVSS)分数,以指示与每个漏洞相关的潜在影响和风险。通过整合 NVD 的严重性分数,Clair 可以根据它检测到的漏洞的严重程度提供更多上下文。

如果 Clair 从 NVD 找到漏洞,对容器镜像中检测到的漏洞的严重性和潜在影响的详细说明和潜在影响将报告给 UI 上的用户。CVSS 增强数据提供了以下优点:

  • 漏洞优先级.通过使用 CVSS 分数,用户可以根据其严重性对漏洞进行优先级排序,帮助他们首先解决最重要的问题。
  • 评估风险。CVSS 分数可帮助 Clair 用户了解对其容器化应用程序造成漏洞的潜在风险。
  • 通讯严重性.CVSS 分数为 Clair 用户提供了一种标准化的方法,来跨团队和机构沟通漏洞的严重性。
  • 通知修复策略.CVSS 增强数据可在开发适当的补救策略时指导 Quay.io 用户。
  • 合规性和报告.将 CVSS 数据集成到 Clair 生成的报告中可帮助组织展示其在解决安全漏洞方面以及符合行业标准和法规的承诺。

11.1.1. Clair 漏洞数据库

Clair 使用以下漏洞数据库来报告镜像中的问题:

  • Ubuntu Oval 数据库
  • Debian 安全跟踪器
  • Red Hat Enterprise Linux (RHEL) Oval 数据库
  • SUSE Oval 数据库
  • Oracle Oval 数据库
  • alpine SecDB 数据库
  • VMware Photon OS 数据库
  • Amazon Web Services (AWS) UpdateInfo
  • 开源漏洞(OSV)数据库

11.1.2. Clair 支持的依赖项

Clair 支持识别和管理以下依赖项:

  • Java
  • Golang
  • Python
  • Ruby

这意味着,它可以分析和报告这些语言中项目依赖的第三方库和软件包。

当包含 Clair 不支持的语言的软件包的镜像被推送到您的存储库时,无法在这些软件包上执行漏洞扫描。用户不会收到不支持的依赖项或软件包的分析或安全报告。因此,应该考虑以下结果:

  • 安全风险.没有扫描漏洞的依赖项或软件包可能会给您的组织带来安全风险。
  • 合规问题.如果您的组织具有特定的安全性或合规要求、未扫描或部分扫描,容器镜像可能会导致与某些法规不兼容。

    注意

    扫描的镜像会被索引,并创建了漏洞报告,但可能会忽略某些不支持的语言中的数据。例如,如果您的容器镜像包含 Lua 应用程序,则不会提供来自 Clair 的反馈,因为 Clair 不会检测到它。它可以检测容器镜像中使用的其他语言,并显示这些语言检测到的 CVE。因此,Clair 镜像 会根据 Clair 支持的内容进行完全扫描

11.2. 使用 UI 查看 Clair 安全扫描

您可以在 UI 上查看 Clair 安全扫描。

流程

  1. 导航到存储库,再单击导航窗格中的 Tags。此页面显示安全扫描的结果。
  2. 要显示有关多架构镜像的更多信息,请点 See Child Manifests 查看扩展视图中的清单列表。
  3. See Child Manifests 下的相关链接,例如,1 Unknown 被重定向到 Security Scanner 页面。
  4. Security Scanner 页面提供了标签的信息,如镜像易受哪些 CVE,以及您可能可用的补救选项。
注意

镜像扫描仅列出 Clair 安全扫描程序发现的漏洞。用户对漏洞的做了哪些操作是用户所说的。

11.3. Clair 严重性映射

Clair 提供了全面的漏洞评估和管理方法。其基本功能之一是对安全数据库严重性字符串进行规范化。这个过程通过将漏洞严重性映射到预定义的值,从而简化对漏洞严重性的评估。通过此映射,客户端可以有效地响应漏洞严重性,而无需破坏每个安全数据库的唯一严重性字符串。这些映射的严重性字符串与相应安全数据库中发现的字符串一致,确保漏洞评估的一致性和准确性。

11.3.1. Clair 严重性字符串

Clair 会警告用户有以下严重性字符串:

  • Unknown
  • negligible
  • Medium
  • High
  • Critical

这些严重性字符串与相关安全数据库中找到的字符串类似。

alpine 映射

alpine SecDB 数据库不提供严重性信息。所有漏洞严重性都将为 Unknown。

Expand
alpine 严重性Clair 严重性

*

Unknown

AWS 映射

AWS UpdateInfo 数据库提供严重性信息。

Expand
AWS 严重性Clair 严重性

Medium

重要

High

critical

Critical

Debian 映射

Debian Oval 数据库提供严重性信息。

Expand
Debian 严重性Clair 严重性

*

Unknown

Unimportant

Medium

Medium

High

High

Critical

Oracle 映射

Oracle Oval 数据库提供严重性信息。

Expand
Oracle 严重性Clair 严重性

N/A

Unknown

Medium

重要

High

CRITICAL

Critical

RHEL 映射

RHEL Oval 数据库提供严重性信息。

Expand
RHEL 严重性Clair 严重性

None

Unknown

Moderate(中度)

Medium

重要的

High

Critical

Critical

SUSE 映射

SUSE Oval 数据库提供严重性信息。

Expand
重要性Clair 严重性

None

Unknown

Moderate(中度)

Medium

重要的

High

Critical

Critical

Ubuntu 映射

Ubuntu Oval 数据库提供严重性信息。

Expand
重要性Clair 严重性

Untriaged

Unknown

negligible

negligible

Medium

Medium

High

High

Critical

Critical

OSV 映射
Expand
表 11.1. CVSSv3
基本分数Clair 严重性

0.0

negligible

0.1-3.9

4.0-6.9

Medium

7.0-8.9

High

9.0-10.0

Critical

Expand
表 11.2. CVSSv2
基本分数Clair 严重性

0.0-3.9

4.0-6.9

Medium

7.0-10

High

第 12 章 构建容器镜像

构建容器镜像涉及为容器化应用程序创建蓝图。蓝图依赖于其他公共存储库中的基础镜像,以定义如何安装和配置应用程序。

注意

因为蓝图依赖于其他公共存储库中的镜像,所以它们可能会受速率限制。因此,您的构建 可能会失败

Quay.io 支持构建 Docker 和 Podman 容器镜像的功能。此功能对于依赖容器和容器编配的开发人员和组织而言非常宝贵。

在 Quay.io 上,此功能可在免费和付费的层计划中正常工作。

注意

Quay.io 限制一个用户可以一次提交的同步构建数量。

12.1. 构建上下文

使用 Docker 或 Podman 构建镜像时,将指定一个目录成为 构建上下文。对于手动构建和构建触发器,这也是如此,因为 Quay.io 创建的 Build 与在本地机器上运行 docker buildpodman build 不同。

Quay.io 构建上下文始终在构建设置 的子目录 中指定,如果未指定目录,则回退到 Build 源的根目录。

触发构建时,Quay.io 构建 worker 将 Git 存储库克隆到 worker 机器,然后在执行构建前输入 Build 上下文。

对于基于 .tar 归档的构建,构建 worker 会提取存档并输入构建上下文。例如:

提取的构建存档

example
├── .git
├── Dockerfile
├── file
└── subdir
    └── Dockerfile
Copy to Clipboard Toggle word wrap

假设您 Extracted Build 存档 是目录结构获取名为 example 的 Github 存储库。如果在 Build 触发器设置中没有指定子目录,或者在手动启动构建时,构建将在示例目录中运行。

如果在 Build 触发器设置中指定子目录,如 subdir,则只有其中的 Dockerfile 可用于构建。这意味着您无法使用 Dockerfile 中的 ADD 命令来添加文件,因为它位于构建上下文之外。

与 Docker Hub 不同,Dockerfile 是 Quay.io 上构建上下文的一部分。因此,它不能出现在 .dockerignore 文件中。

12.2. 构建触发器的标签命名

自定义标签可用于 Quay.io。

一个选项是包含作为每个构建的镜像标签分配的任何字符串字符。或者,您可以在构建触发器的 Configure Tagging 部分中使用以下标签模板,以使用每个提交中的信息标记镜像:

Configure Tagging

  • ${commit}: 发布的提交的完全 SHA
  • ${parsed_ref.branch}: Branch 信息(如果可用)
  • ${parsed_ref.tag}: Tag 信息(如果可用)
  • ${parsed_ref.remote}: 远程名称
  • ${commit_info.date}: 提交时的日期
  • ${commit_info.author.username}: Username of the author of the commit
  • ${commit_info.short_sha}: 提交 SHA 的第一个 7 个字符
  • ${committer.properties.username}: committer 的 Username

此列表未完成,但 包含了用于标记目的的最有用的选项。您可以在此页面中找到完整的标签模板模式。https://github.com/quay/quay/blob/abfde5b9d2cf7d7145e68a00c9274011b4fe0661/buildtrigger/basehandler.py#L96-L195

如需更多信息,请参阅为 Red Hat Quay 和 Quay.io 构建触发器中设置自定义标签模板

12.3. 跳过源控制触发的构建

要指定 Quay.io 构建系统应忽略提交,请在提交消息的任何位置添加文本 [skip build][build skip]

12.4. 启动新构建

默认情况下,Quay.io 用户可以开箱即用的新构建。

通过上传 Dockerfile,请使用以下步骤启动新的构建。有关创建 构建触发器 的详情,请参考"Build triggers"。

先决条件

  • 您已导航到存储库的 Builds 页面。

流程

  1. Builds 页面上,单击 Start New Build
  2. 出现提示时,单击 Upload Dockerfile 以上传 Dockerfile 或包含根目录中的 Dockerfile 的存档。
  3. 单击 Start Build

    注意
    • 目前,在手动启动构建时,用户无法指定 Docker 构建上下文。
    • 目前,Red Hat Quay v2 UI 不支持 BitBucket。
  4. 您将被重定向到 构建,可实时查看。等待 Dockerfile 构建完成 并推送。
  5. 可选。您可以点 Download Logs 下载日志,或 Copy Logs 来复制日志。
  6. 单击 back 按钮,以返回到 Repository Builds 页面,您可以在其中查看 构建历史记录

    Build history v2 UI

12.5. 构建触发器

构建触发器 是在满足特定条件时自动启动容器镜像构建的机制,如更改源代码、依赖项更新或 创建 webhook 调用。这些触发器有助于自动化镜像构建过程,并确保容器镜像始终保持最新状态,而无需手动干预。

以下小节涵盖了与创建构建触发器、标签命名约定、如何跳过源控制构建、启动构建或手动触发构建相关的内容。

12.5.1. 创建构建触发器

以下流程 设置自定义 Git 触发器。自定义 Git 触发器是任何 Git 服务器充当 构建触发器 的通用方法。它只依赖于 SSH 密钥和 Webhook 端点。创建自定义 Git 触发器与创建任何其他触发器类似,但以下除外:

  • Quay.io 无法自动检测要用于触发器的正确 Robot 帐户。这必须在创建过程中手动完成。

但是,可以复制这些步骤,以使用 Github、Gitlab 或 Bitbucket 创建 构建触发器,但在 config.yaml 文件中为这些服务配置凭证。

注意
  • 如果要使用 Github 创建 构建触发器,则必须通过创建 OAuth 应用程序将 Github 配置为与 Red Hat Quay 搭配使用。如需更多信息,请参阅"创建 OAuth 应用程序 Github"。

流程

  1. 登录到您的 Red Hat Quay registry。
  2. 在导航窗格中,单击 Repositories
  3. 单击 Create Repository
  4. Builds 选项卡。
  5. Builds 页面中,点 Create Build Trigger
  6. 选择所需的平台,如 GithubBitbucketGitlab 或使用自定义 Git 存储库。在本例中,单击 Custom Git Repository Push
  7. 输入自定义 Git 存储库名称,例如 git@github.com:<username>/<repo>.git。然后,单击 Next
  8. 提示时,通过选择其中一个或两者都选项来配置标记选项:

    • 使用分支或标签名称 标记清单。选择此选项时,构建的清单会标记 git 提交的分支或标签的名称。
    • 如果在默认分支 上,添加 latest 标签。在选择此选项时,如果构建发生在存储库的默认分支上,则构建带有 latest 的清单会被标记。

      另外,您可以添加自定义标记模板。您可以在此处输入多个标签模板,包括将提交中的短 SHA ID、时间戳、作者名称、提交者和分支名称用作标签。如需更多信息,请参阅 "Tag naming for build triggers"。

      配置标记后,单击 下一步

  9. 出现提示时,选择在调用触发器时要构建的 Dockerfile 的位置。如果 Dockerfile 位于 git 存储库的根目录并命名 Dockerfile,请输入 /Dockerfile 作为 Dockerfile 路径。然后,单击 Next
  10. 出现提示时,选择 Docker 构建的上下文。如果 Dockerfile 位于 Git 存储库的根目录,请输入 / 作为构建上下文目录。然后,单击 Next
  11. 可选。选择可选的机器人帐户。这可让您在构建过程中拉取私有基础镜像。如果您知道没有使用私有基础镜像,您可以跳过这一步。
  12. 点击 Next。检查任何验证警告。如有必要,请在单击 Finish 前修复问题。
  13. 您收到了触发器已成功激活的警报。请注意,使用这个触发器需要以下操作:

    • 您必须为以下公钥授予 git 存储库读取访问权限。
    • 您必须将存储库设置为 POST 到以下 URL,以触发构建。

      保存 SSH 公钥,然后点 return to <organization_name>/<repository_name>。您将被重定向到存储库的 Builds 页面。

  14. Builds 页面中,您现在有一个 构建触发器。例如:

    Example Build trigger

    创建自定义 Git 触发器后,需要额外的步骤。继续 继续"设置自定义 Git 触发器"。

    如果您要为 Github、Gitlab 或 Bitbucket 设置构建触发器,请继续" 手动触发构建 "。

12.5.2. 手动触发构建

可以按照以下流程手动触发 构建

流程

  1. Builds 页面中,启动新构建
  2. 出现提示时,选择 Invoke Build Trigger
  3. Run Trigger Now 手动启动进程。
  4. 输入要启动构建的提交 ID,例如 1c002dd

    构建启动后,您可以在 Repository Builds 页面上看到 构建 ID

12.6. 设置自定义 Git 触发器

创建自定义 Git 触发器 后,需要额外的步骤:

  1. 您必须提供创建触发器时生成的 SSH 公钥的读访问权限。
  2. 您必须设置一个 webhook,它将 POST 到 Quay.io 端点来触发构建。

只有在使用 自定义 Git 触发器 时,才需要这些步骤。

12.6.1. 获取构建触发器凭证

SSH 公钥和 Webhook 端点 URL 在 Red Hat Quay UI 上提供。

先决条件

  • 您已创建了自定义 Git 触发器

流程

  1. 在存储库的 Builds 页面中,单击 自定义 Git 触发器 菜单 kebab。
  2. 单击 View Credentials
  3. 保存 SSH 公钥和 Webhook 端点 URL。

可以通过从 Settingsgear 图标选择 View Credentials 来使用密钥和 URL。

查看和修改存储库中的标签

Trigger Credentials

12.6.1.1. SSH 公钥访问

根据 Git 服务器配置,可以通过多种方式安装 Quay.io 为自定义 Git 触发器生成的 SSH 公钥。

例如,服务器上获取 Git 的文档描述了如何在基于 Linux 的机器上设置 Git 服务器,专注于通过 SSH 管理存储库和访问控制。在此过程中,将小服务器设置为将密钥添加到 $HOME/.ssh/authorize_keys 文件夹,它为 构建器 提供克隆存储库的访问权限。

对于任何未正式支持的 Git 存储库管理软件,通常有一个位置来输入通常标记为 Deploy Keys 的密钥。

12.6.1.2. Webhook

要自动触发构建,您必须使用以下格式将 .json 有效负载 POST 到 webhook URL:

注意

此请求需要一个包含 application/jsonContent-Type 标头才能有效。

Webhook 示例

{
  "commit": "1c002dd",                                   // required
  "ref": "refs/heads/master",                            // required
  "default_branch": "master",                            // required
  "commit_info": {                                       // optional
    "url": "gitsoftware.com/repository/commits/1234567", // required
    "message": "initial commit",                         // required
    "date": "timestamp",                                 // required
    "author": {                                          // optional
      "username": "user",                                // required
      "avatar_url": "gravatar.com/user.png",             // required
      "url": "gitsoftware.com/users/user"                // required
    },
    "committer": {                                       // optional
      "username": "user",                                // required
      "avatar_url": "gravatar.com/user.png",             // required
      "url": "gitsoftware.com/users/user"                // required
    }
  }
}
Copy to Clipboard Toggle word wrap

这通常可以通过 post-receive Git hook 来完成,但它取决于服务器设置。

第 13 章 通知概述

Quay.io 支持在存储库中为存储库的生命周期中发生的各种事件添加通知。

13.1. 通知操作

通知添加到 Repository Settings 页面的 Events 和 Notifications 部分。它们也会添加到 Notifications 窗口中,该窗口可通过单击 Quay.io 导航窗格中的 bell 图标找到。

Quay.io 通知可以设置为发送到 用户团队整个组织

通知可以通过以下方法之一交付。

电子邮件通知

电子邮件发送到描述指定事件的指定地址。电子邮件地址必须 基于每个存储库 进行验证。

Webhook POST 通知

使用事件数据对指定的 URL 发出 HTTP POST 调用。有关事件数据的更多信息,请参阅"Repository 事件描述"。

当 URL 是 HTTPS 时,调用从 Quay.io 设置 SSL 客户端证书。此证书的验证证明来自 Quay.io 的调用。对 2xx 范围内的状态代码的响应被视为成功。任何其他状态代码的响应被视为失败,并导致重试 Webhook 通知。

Flowdock 通知

将消息发布到 Flowdock。

HipChat 通知

向 HipChat 发发消息。

Slack 通知

向 Slack 发布消息。

13.2. 使用 UI 创建通知

使用以下步骤添加通知。

先决条件

  • 您已创建了软件仓库。
  • 有存储库的管理特权。

流程

  1. 导航到 Quay.io 上的存储库。
  2. 在导航窗格中,单击 Settings
  3. Events and Notifications 类别中,点 Create Notification 为存储库事件添加新通知。此时会出现 Create notification 弹出框。
  4. Create repository 弹出窗口中,点 When this event occurs select a event。您可以为以下类型的事件选择通知:

    • 推送到存储库
    • 镜像构建失败
    • 镜像构建已排队
    • 镜像构建已启动
    • 镜像构建成功
    • 镜像构建已取消
    • 镜像到期触发器
  5. 选择了事件类型后,选择 notification 方法。支持以下方法:

    • Quay 通知
    • 电子邮件通知
    • Webhook POST
    • Flowdock 团队通知
    • HipChat Room 通知
    • Slack 通知

      根据您选择的方法,您必须包含其他信息。例如,如果您选择 E-mail,则需要包含电子邮件地址和可选通知标题。

  6. 选择事件和通知方法后,单击 Create Notification

13.2.1. 创建镜像过期通知

镜像过期事件触发器可以配置为通过电子邮件、Slack、webhook 等方式通知用户,并可在存储库级别进行配置。可以为在任意天数内过期的镜像设置触发器,并可与自动运行功能一起使用。

可以使用 Red Hat Quay v2 UI 或使用 createRepoNotification API 端点来设置镜像过期通知。

先决条件

  • FEATURE_GARBAGE_COLLECTION: trueconfig.yaml 文件中设置。
  • 可选。FEATURE_AUTO_PRUNE: trueconfig.yaml 文件中设置。

流程

  1. 在 Red Hat Quay v2 UI 上,单击 Repositories
  2. 选择存储库的名称。
  3. SettingsEvents and notifications
  4. 单击 Create notification。此时会出现 Create notification 弹出框。
  5. 单击 Select event…​ 框,然后单击 Image expiry trigger
  6. 在镜像以天为单位到期时,在您要接收警报时输入镜像过期前的天数。例如,在 1 天内使用 1。
  7. Select method…​ 框中,点击以下之一:

    • 电子邮件
    • Webhook POST
    • Flowdock 团队通知
    • HipChat Room 通知
    • Slack 通知
  8. 根据您选择的方法,包含必要的数据。例如,如果您选择 Webhook POST,请包含 Webhook URL
  9. 可选。提供 POST JSON 正文模板
  10. 可选。为您的通知提供 标题
  11. Submit。您返回到 Events 和 notifications 页面,现在显示通知。
  12. 可选。您可以在 config.yaml 文件中设置 NOTIFICATION_TASK_RUN_MINIMUM_INTERVAL_MINUTES 变量。如果有任何过期镜像通知,则会自动发送。默认情况下,这设置为 300 或 5 小时,但可调整为保证。

    NOTIFICATION_TASK_RUN_MINIMUM_INTERVAL_MINUTES: 300 
    1
    Copy to Clipboard Toggle word wrap
    1
    默认情况下,此字段设置为 300 或 5 小时。

验证

  1. 点菜单 kebab → Test Notification。返回以下信息:

    Test Notification Queued
    A test version of this notification has been queued and should appear shortly
    Copy to Clipboard Toggle word wrap
  2. 根据您选择的方法,检查您的电子邮件地址、webhook 地址、Slack 频道等。发送的信息应类似以下示例:

    {
      "repository": "sample_org/busybox",
      "namespace": "sample_org",
      "name": "busybox",
      "docker_url": "quay-server.example.com/sample_org/busybox",
      "homepage": "http://quay-server.example.com/repository/sample_org/busybox",
      "tags": [
        "latest",
        "v1"
      ],
      "expiring_in": "1 days"
    }
    Copy to Clipboard Toggle word wrap

13.3. 使用 API 创建通知

使用以下步骤添加通知。

先决条件

  • 您已创建了软件仓库。
  • 有存储库的管理特权。
  • 您已创建了 OAuth 访问令牌

流程

  1. 输入以下 POST /api/v1/repository/{repository}/notification 命令在存储库上创建通知:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "event": "<event>",
        "method": "<method>",
        "config": {
          "<config_key>": "<config_value>"
        },
        "eventConfig": {
          "<eventConfig_key>": "<eventConfig_value>"
        }
      }' \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/notification/
    Copy to Clipboard Toggle word wrap

    此命令不会在 CLI 中返回输出。相反,您可以输入以下 GET /api/v1/repository/{repository}/notification/{uuid} 命令来获取有关存储库通知的信息:

    {"uuid": "240662ea-597b-499d-98bb-2b57e73408d6", "title": null, "event": "repo_push", "method": "quay_notification", "config": {"target": {"name": "quayadmin", "kind": "user", "is_robot": false, "avatar": {"name": "quayadmin", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}}}, "event_config": {}, "number_of_failures": 0}
    Copy to Clipboard Toggle word wrap
  2. 您可以通过输入以下 POST /api/v1/repository/{repository}/notification/{uuid}/test 命令来测试存储库通知:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/notification/<uuid>/test
    Copy to Clipboard Toggle word wrap

    输出示例

    {}
    Copy to Clipboard Toggle word wrap

  3. 您可以通过输入以下 POST /api/v1/repository/{repository}/notification/{uuid} 命令重置存储库通知失败:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/notification/<uuid>
    Copy to Clipboard Toggle word wrap
  4. 输入以下 DELETE /api/v1/repository/{repository}/notification/{uuid} 命令来删除存储库通知:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/notification/<uuid>
    Copy to Clipboard Toggle word wrap

    此命令不会在 CLI 中返回输出。相反,您可以输入以下 GET /api/v1/repository/{repository}/notification/ 命令来检索所有通知的列表:

    $ curl -X GET  -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/notification
    Copy to Clipboard Toggle word wrap

    输出示例

    {"notifications": []}
    Copy to Clipboard Toggle word wrap

13.4. 仓库事件描述

以下小节详细介绍了存储库事件。

Repository Push

向存储库成功推送一个或多个镜像:

{
  "name": "repository",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "homepage": "https://quay.io/repository/dgangaia/repository",
  "updated_tags": [
    "latest"
  ]
}
Copy to Clipboard Toggle word wrap
Dockerfile 构建队列

以下示例是 Dockerfile 构建中的响应,它已放入构建系统中。

注意

响应可能会根据可选属性的使用而有所不同。

{
  "build_id": "296ec063-5f86-4706-a469-f0a400bf9df2",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "repo": "test",
  "trigger_metadata": {
    "default_branch": "master",
    "commit": "b7f7d2b948aacbe844ee465122a85a9368b2b735",
    "ref": "refs/heads/master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                             //Optional
      "url": "https://github.com/dgangaia/test/commit/b7f7d2b948aacbe844ee465122a85a9368b2b735",
      "date": "2019-03-06T12:48:24+11:00",
      "message": "adding 5",
      "author": {                                                                //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                    //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"    //Optional
      },
      "committer": {
        "username": "web-flow",
        "url": "https://github.com/web-flow",
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"
      }
    }
  },
  "is_manual": false,
  "manual_user": null,
  "homepage": "https://quay.io/repository/dgangaia/test/build/296ec063-5f86-4706-a469-f0a400bf9df2"
}
Copy to Clipboard Toggle word wrap
已启动 Dockerfile 构建

以下示例是 Dockerfile 构建中的响应,它已放入构建系统中。

注意

响应可能会根据可选属性的使用而有所不同。

{
  "build_id": "a8cc247a-a662-4fee-8dcb-7d7e822b71ba",
  "trigger_kind": "github",                                                     //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                         //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "50bc599",
  "trigger_metadata": {                                                         //Optional
    "commit": "50bc5996d4587fd4b2d8edc4af652d4cec293c42",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                            //Optional
      "url": "https://github.com/dgangaia/test/commit/50bc5996d4587fd4b2d8edc4af652d4cec293c42",
      "date": "2019-03-06T14:10:14+11:00",
      "message": "test build",
      "committer": {                                                            //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                   //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"   //Optional
      },
      "author": {                                                               //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                   //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"   //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/a8cc247a-a662-4fee-8dcb-7d7e822b71ba"
}
Copy to Clipboard Toggle word wrap
Dockerfile 构建成功完成

以下示例是 Build 系统成功完成的 Dockerfile 构建的响应。

注意

此事件与构建的镜像或镜像的 Repository Push 事件同时发生。

{
  "build_id": "296ec063-5f86-4706-a469-f0a400bf9df2",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "b7f7d2b",
  "image_id": "sha256:0339f178f26ae24930e9ad32751d6839015109eabdf1c25b3b0f2abf8934f6cb",
  "trigger_metadata": {
    "commit": "b7f7d2b948aacbe844ee465122a85a9368b2b735",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                              //Optional
      "url": "https://github.com/dgangaia/test/commit/b7f7d2b948aacbe844ee465122a85a9368b2b735",
      "date": "2019-03-06T12:48:24+11:00",
      "message": "adding 5",
      "committer": {                                                              //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                     //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"                                                        //Optional
      },
      "author": {                                                                 //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                     //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"     //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/296ec063-5f86-4706-a469-f0a400bf9df2",
  "manifest_digests": [
    "quay.io/dgangaia/test@sha256:2a7af5265344cc3704d5d47c4604b1efcbd227a7a6a6ff73d6e4e08a27fd7d99",
    "quay.io/dgangaia/test@sha256:569e7db1a867069835e8e97d50c96eccafde65f08ea3e0d5debaf16e2545d9d1"
  ]
}
Copy to Clipboard Toggle word wrap
Dockerfile 构建失败

以下示例是来自已失败的 Dockerfile 构建的响应。

{
  "build_id": "5346a21d-3434-4764-85be-5be1296f293c",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "docker_url": "quay.io/dgangaia/test",
  "error_message": "Could not find or parse Dockerfile: unknown instruction: GIT",
  "namespace": "dgangaia",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "6ae9a86",
  "trigger_metadata": {                                                           //Optional
    "commit": "6ae9a86930fc73dd07b02e4c5bf63ee60be180ad",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                              //Optional
      "url": "https://github.com/dgangaia/test/commit/6ae9a86930fc73dd07b02e4c5bf63ee60be180ad",
      "date": "2019-03-06T14:18:16+11:00",
      "message": "failed build test",
      "committer": {                                                              //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                     //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"     //Optional
      },
      "author": {                                                                 //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                     //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"     //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/5346a21d-3434-4764-85be-5be1296f293c"
}
Copy to Clipboard Toggle word wrap
Dockerfile 构建已取消

以下示例是已取消的 Dockerfile 构建的响应。

{
  "build_id": "cbd534c5-f1c0-4816-b4e3-55446b851e70",
  "trigger_kind": "github",
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "cbce83c",
  "trigger_metadata": {
    "commit": "cbce83c04bfb59734fc42a83aab738704ba7ec41",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {
      "url": "https://github.com/dgangaia/test/commit/cbce83c04bfb59734fc42a83aab738704ba7ec41",
      "date": "2019-03-06T14:27:53+11:00",
      "message": "testing cancel build",
      "committer": {
        "username": "web-flow",
        "url": "https://github.com/web-flow",
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"
      },
      "author": {
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/cbd534c5-f1c0-4816-b4e3-55446b851e70"
}
Copy to Clipboard Toggle word wrap

第 14 章 开放容器项目支持

容器 registry 最初设计为支持 Docker 镜像格式中的容器镜像。为了促进除 Docker 外的其他运行时,还创建了开放容器项目(OCI),以提供与容器运行时和镜像格式相关的标准化。大多数容器注册表都支持 OCI 标准化,因为它基于 Docker 镜像清单 V2、Schema 2 格式。

除了容器镜像外,还出现各种工件,它们不仅支持单独的应用程序,还存在 Kubernetes 平台作为一个整体的支持。这些范围包括用于安全性和监管的 Open Policy Agent (OPA)策略到 Helm chart 和 Operator,以帮助应用程序部署。

Quay.io 是一个私有容器 registry,它不仅存储容器镜像,还支持整个工具生态系统,以帮助管理容器。Quay.io 会努力与 OCI 1.1 镜像 和分发规格 兼容,并支持常见的介质类型,如 Helm chart (只要它们使用支持 OCI 的 Helm 版本)以及容器镜像清单或层组件中的各种任意介质类型。当 registry 对接受的介质类型更严格时,对 OCI 介质类型的支持与之前的 Quay.io 迭代不同。由于 Quay.io 现在与更广泛的介质类型一起工作,包括之前不在其支持范围范围之外的介质类型,所以现在它比标准容器镜像格式更广泛,也只是标准容器镜像格式的修改。

除了其对 novel 介质类型的支持外,Quay.io 还可确保与 Docker 镜像的兼容性,包括 V2_2 和 V2_1 格式。与 Docker V2_2 和 V2_1 镜像的兼容性演示了 Quay.io 针对 Docker 用户提供无缝体验的承诺。此外,Quay.io 继续扩展对 Docker V1 拉取的支持,并满足可能仍然依赖此早期版本的 Docker 镜像的用户。

对 OCI 工件的支持会被默认启用。以下示例演示了如何使用一些介质类型,这些类型可用作使用其他 OCI 介质类型的示例。

14.1. Helm 和 OCI 的先决条件

Helm 简化了应用程序的打包和部署方式。Helm 使用名为 Charts 的打包格式,其中包含代表应用程序的 Kubernetes 资源。Quay.io 支持 Helm chart,只要它们是 OCI 支持的版本。

使用以下步骤预配置您的系统以使用 Helm 和其他 OCI 介质类型。

最新版本的 Helm 可以在 Helm releases 页面中下载。

14.2. 使用 Helm chart

使用以下示例从 Red Hat Community of practice (CoP)存储库下载并推送 etherpad 图表。

先决条件

  • 您已登录到 Quay.io。

流程

  1. 输入以下命令添加 chart 存储库:

    $ helm repo add redhat-cop https://redhat-cop.github.io/helm-charts
    Copy to Clipboard Toggle word wrap
  2. 输入以下命令在 Chart 仓库中本地更新可用 chart 的信息:

    $ helm repo update
    Copy to Clipboard Toggle word wrap
  3. 输入以下命令从存储库拉取 chart:

    $ helm pull redhat-cop/etherpad --version=0.0.4 --untar
    Copy to Clipboard Toggle word wrap
  4. 输入以下命令将 chart 打包到 chart 归档中:

    $ helm package ./etherpad
    Copy to Clipboard Toggle word wrap

    输出示例

    Successfully packaged chart and saved it to: /home/user/linux-amd64/etherpad-0.0.4.tgz
    Copy to Clipboard Toggle word wrap
  5. 使用 helm registry 登录 Quay.io:

    $ helm registry login quay.io
    Copy to Clipboard Toggle word wrap
  6. 使用 helm push 命令将 chart 推送到您的存储库:

    helm push etherpad-0.0.4.tgz oci://quay.io/<organization_name>/helm
    Copy to Clipboard Toggle word wrap

    输出示例:

    Pushed: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4
    Digest: sha256:a6667ff2a0e2bd7aa4813db9ac854b5124ff1c458d170b70c2d2375325f2451b
    Copy to Clipboard Toggle word wrap
  7. 通过删除本地副本来确保推送正常工作,然后从存储库拉取 chart:

    $ rm -rf etherpad-0.0.4.tgz
    Copy to Clipboard Toggle word wrap
    $ helm pull oci://quay.io/<organization_name>/helm/etherpad --version 0.0.4
    Copy to Clipboard Toggle word wrap

    输出示例:

    Pulled: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4
    Digest: sha256:4f627399685880daf30cf77b6026dc129034d68c7676c7e07020b70cf7130902
    Copy to Clipboard Toggle word wrap

14.3. Cosign OCI 支持

Cosign 是一个可用于签署和验证容器镜像的工具。它使用 ECDSA-P256 签名算法和 Red Hat 简单签名有效负载格式来创建存储在 PKIX 文件中的公钥。私钥存储为加密的 PEM 文件。

Cosign 目前支持以下内容:

  • 硬件和 KMS 签名
  • bring-your-own PKI
  • OIDC PKI
  • 内置二进制透明度和时间戳服务

使用以下步骤直接安装 Cosign。

先决条件

  • 已安装 Go 版本 1.16 或更高版本。

流程

  1. 输入以下 go 命令直接安装 Cosign:

    $ go install github.com/sigstore/cosign/cmd/cosign@v1.0.0
    Copy to Clipboard Toggle word wrap

    输出示例

    go: downloading github.com/sigstore/cosign v1.0.0
    go: downloading github.com/peterbourgon/ff/v3 v3.1.0
    Copy to Clipboard Toggle word wrap

  2. 输入以下命令为 Cosign 生成键值对:

    $ cosign generate-key-pair
    Copy to Clipboard Toggle word wrap

    输出示例

    Enter password for private key:
    Enter again:
    Private key written to cosign.key
    Public key written to cosign.pub
    Copy to Clipboard Toggle word wrap

  3. 输入以下命令为键值对签名:

    $ cosign sign -key cosign.key quay.io/user1/busybox:test
    Copy to Clipboard Toggle word wrap

    输出示例

    Enter password for private key:
    Pushing signature to: quay-server.example.com/user1/busybox:sha256-ff13b8f6f289b92ec2913fa57c5dd0a874c3a7f8f149aabee50e3d01546473e3.sig
    Copy to Clipboard Toggle word wrap

    如果您遇到 错误: signing quay-server.example.com/user1/busybox:test: getting remote image: GET https://quay-server.example.com/v2/user1/busybox/manifests/test: UNAUTHORIZED: access to the requested resource is not authorized; map[] error,因为 Cosign 依赖于 ~./docker/config.json 用于授权,您可能需要执行以下命令:

    $ podman login --authfile ~/.docker/config.json quay.io
    Copy to Clipboard Toggle word wrap

    输出示例

    Username:
    Password:
    Login Succeeded!
    Copy to Clipboard Toggle word wrap

  4. 输入以下命令查看更新的授权配置:

    $ cat ~/.docker/config.json
    {
    	"auths": {
    		"quay-server.example.com": {
    			"auth": "cXVheWFkbWluOnBhc3N3b3Jk"
    		}
    	}
    Copy to Clipboard Toggle word wrap

14.4. 安装和使用 Cosign

使用以下步骤直接安装 Cosign。

先决条件

  • 已安装 Go 版本 1.16 或更高版本。
  • 您已在 config.yaml 文件中将 FEATURE_GENERAL_OCI_SUPPORT 设置为 True

流程

  1. 输入以下 go 命令直接安装 Cosign:

    $ go install github.com/sigstore/cosign/cmd/cosign@v1.0.0
    Copy to Clipboard Toggle word wrap

    输出示例

    go: downloading github.com/sigstore/cosign v1.0.0
    go: downloading github.com/peterbourgon/ff/v3 v3.1.0
    Copy to Clipboard Toggle word wrap

  2. 输入以下命令为 Cosign 生成键值对:

    $ cosign generate-key-pair
    Copy to Clipboard Toggle word wrap

    输出示例

    Enter password for private key:
    Enter again:
    Private key written to cosign.key
    Public key written to cosign.pub
    Copy to Clipboard Toggle word wrap

  3. 输入以下命令为键值对签名:

    $ cosign sign -key cosign.key quay.io/user1/busybox:test
    Copy to Clipboard Toggle word wrap

    输出示例

    Enter password for private key:
    Pushing signature to: quay-server.example.com/user1/busybox:sha256-ff13b8f6f289b92ec2913fa57c5dd0a874c3a7f8f149aabee50e3d01546473e3.sig
    Copy to Clipboard Toggle word wrap

    如果您遇到 错误: signing quay-server.example.com/user1/busybox:test: getting remote image: GET https://quay-server.example.com/v2/user1/busybox/manifests/test: UNAUTHORIZED: access to the requested resource is not authorized; map[] error,因为 Cosign 依赖于 ~./docker/config.json 用于授权,您可能需要执行以下命令:

    $ podman login --authfile ~/.docker/config.json quay.io
    Copy to Clipboard Toggle word wrap

    输出示例

    Username:
    Password:
    Login Succeeded!
    Copy to Clipboard Toggle word wrap

  4. 输入以下命令查看更新的授权配置:

    $ cat ~/.docker/config.json
    {
    	"auths": {
    		"quay-server.example.com": {
    			"auth": "cXVheWFkbWluOnBhc3N3b3Jk"
    		}
    	}
    Copy to Clipboard Toggle word wrap

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat