使用 Red Hat Quay


Red Hat Quay 3

使用 Red Hat Quay

Red Hat OpenShift Documentation Team

摘要

了解如何使用 Red Hat Quay

前言

Red Hat Quay 容器镜像 registry 充当存储容器镜像的集中式 hub。Red Hat Quay 用户可以创建存储库来有效地管理镜像,并根据需要向存储库授予特定的读取(拉取)和写(推送)权限。管理特权会扩展这些功能,允许用户执行一组更广泛的任务,如添加用户和控制默认设置等。

本指南概述了 Red Hat Quay 用户和机构、其租期模型以及基本操作,如创建和删除用户、机构和存储库、处理访问以及与标签交互。它包括 UI 和 API 操作。

注意

以下 API 端点在 Red Hat Quay API 指南中 链接到其关联的条目。Red Hat Quay API 指南提供有关每个端点的更多信息,如响应代码和可选查询参数。

第 1 章 Red Hat Quay tenancy 模型

在创建存储库以在 Red Hat Quay 中包含容器镜像之前,您应该考虑如何构建这些存储库。使用 Red Hat Quay,每个存储库都需要一个与组织 或用户 的连接。这种关系定义了存储库的所有权和权限。

1.1. 租期模型

Tenancy model

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

第 2 章 启用并使用 Red Hat Quay API

通过使用 Red Hat Quay API,您可以简化容器 registry 管理,自动执行任务,并将 Red Hat Quay 的功能整合到现有工作流中。这可以提高效率,提供更高的灵活性(通过存储库管理、用户管理、用户权限、镜像管理等),提高您的组织的稳定性、存储库或整体部署等。

有关如何使用 Red Hat Quay API 的详细信息,请参阅 Red Hat Quay API 指南。在本指南中,涵盖了以下主题:

  • Red Hat Quay 令牌类型,包括 OAuth 2 访问令牌、机器人帐户令牌和 OCI 引用器令牌以及如何生成这些令牌。
  • 通过配置 config.yaml 文件启用 Red Hat Quay API。
  • 如何将 OAuth 2 帐户令牌传递给所需的端点来使用 Red Hat Quay API。
  • API 示例,包括管理员如何自动执行某些任务的通用示例。

在使用本章中提供的 API 端点前,请参阅 Red Hat Quay API 指南。

第 3 章 Red Hat Quay 用户帐户概述

用户帐户 表示对平台特性和功能验证访问权限的个人。用户帐户提供创建和管理存储库的功能,上传和检索容器镜像,以及控制这些资源的访问权限。此帐户用于组织并覆盖 Red Hat Quay 中的容器镜像管理。

您可以在 zRed Hat Quay UI 上或使用 Red Hat Quay API 来创建和删除新用户。

3.1. 使用 UI 创建用户帐户

使用以下步骤,使用 UI 为 Red Hat Quay 存储库创建新用户。

先决条件

  • 以超级用户身份登录 Red Hat Quay 部署。

流程

  1. 以超级用户身份登录到您的 Red Hat Quay 存储库。
  2. 在导航窗格中,选择您的帐户名称,然后单击 Super User Admin Panel
  3. 单击列中的 Users 图标。
  4. 创建用户 按钮。
  5. 输入新用户的用户名和电子邮件地址,然后单击 创建用户 按钮。
  6. 您会被重定向到 Users 页面,其中现在还有另一个 Red Hat Quay 用户。

    注意

    您可能需要刷新 Users 页面来显示其他用户。

  7. Users 页面中,单击与新用户关联的 Options cogwheel。此时会出现一个下拉菜单,如下图所示:

    Select Options drop-down to change user passwords

  8. 单击 Change Password
  9. 添加新密码,然后单击 Change User Password

    新用户现在可以使用该用户名和密码通过 Web UI 或其首选容器客户端(如 Podman)登录。

3.2. 使用 Red Hat Quay API 创建用户帐户

使用 API 为您的 Red Hat Quay 存储库创建新用户。

先决条件

  • 以超级用户身份登录 Red Hat Quay 部署。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 POST /api/v1/superuser/users/ 端点来创建新用户:

    $ curl -X POST -H "Authorization: Bearer <bearer_token>" -H "Content-Type: application/json" -d '{
      "username": "newuser",
      "email": "newuser@example.com"
    }' "https://<quay-server.example.com>/api/v1/superuser/users/"

    输出示例

    {"username": "newuser", "email": "newuser@example.com", "password": "IJWZ8TIY301KPFOW3WEUJEVZ3JR11CY1", "encrypted_password": "9Q36xF54YEOLjetayC0NBaIKgcFFmIHsS3xTZDLzZSrhTBkxUc9FDwUKfnxLWhco6oBJV1NDBjoBcDGmsZMYPt1dSA4yWpPe/JKY9pnDcsw="}
  2. 导航到您的 Red Hat Quay registry 端点,如 quay-server.example.com,并使用从 API 调用生成的用户名和密码登录。在这种情况下,用户名是 newuser,密码是 IJWZ8TIY301KPFOW3WEUJEVZ3JR11CY1。或者,您可以使用 CLI 登录 registry。例如:

    $ podman login <quay-server.example.com>

    输出示例

    username: newuser
    password: IJWZ8TIY301KPFOW3WEUJEVZ3JR11CY1

  3. 可选。您可以使用 GET /api/v1/superuser/users/ 端点获取所有用户(包括超级用户)的列表:

    $ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/users/"

    输出示例

    {"users": [{"kind": "user", "name": "quayadmin", "username": "quayadmin", "email": "quay@quay.com", "verified": true, "avatar": {"name": "quayadmin", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}, "super_user": true, "enabled": true}, {"kind": "user", "name": "newuser", "username": "newuser", "email": "newuser@example.com", "verified": true, "avatar": {"name": "newuser", "hash": "f338a2c83bfdde84abe2d3348994d70c34185a234cfbf32f9e323e3578e7e771", "color": "#9edae5", "kind": "user"}, "super_user": false, "enabled": true}]}

3.3. 使用 UI 删除用户

使用以下步骤,使用 UI 从 Red Hat Quay 仓库中删除用户。请注意,在删除用户后,用户拥有的专用帐户中的任何软件仓库都不可用。

注意

在某些情况下,当访问 Red Hat Quay UI 的 Superuser Admin Panel 中的 Users 选项卡时,您可能会遇到没有列出用户的情况。相反,会显示一条消息,表示 Red Hat Quay 被配置为使用外部身份验证,用户只能在该系统中创建。

这个错误由以下两个原因之一:

  • 加载用户时,Web UI 会超时。发生这种情况时,用户无法对其执行任何操作。
  • 在 LDAP 身份验证中。当更改 userID 时,但关联的电子邮件不是。目前,Red Hat Quay 不允许创建具有旧电子邮件地址的新用户。

发生这种情况时,您必须使用 Red Hat Quay API 删除用户。

先决条件

  • 以超级用户身份登录 Red Hat Quay 部署。

流程

  1. 以超级用户身份登录到您的 Red Hat Quay 存储库。
  2. 在导航窗格中,选择您的帐户名称,然后单击 Super User Admin Panel
  3. 单击导航窗格中的 Users 图标。
  4. 点要删除的用户旁边的 Options cogwheel。
  5. 单击 删除用户,然后单击 删除用户 进行确认。

3.4. 使用 Red Hat Quay API 删除用户

使用以下步骤使用 API 从 Red Hat Quay 中删除用户。

重要

删除用户后,此用户在其专用帐户中具有的任何存储库都不可用。

先决条件

  • 以超级用户身份登录 Red Hat Quay 部署。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下 DELETE /api/v1/superuser/users/{username} 命令,以从命令行删除用户:

    $ curl -X DELETE -H "Authorization: Bearer <insert token here>" https://<quay-server.example.com>/api/v1/superuser/users/<username>
  2. 从 CLI 删除用户时,CLI 不会返回信息。要确认删除操作,您可以通过进入到 Superuser Admin PanelUsers 或输入以下 GET /api/v1/superuser/users/ 命令来检查 Red Hat Quay UI。然后您可以检查是否存在它们。

    $ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/users/"

第 4 章 Red Hat Quay 机构概述

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

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

    注意

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

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

用户可以创建自己的组织来共享容器镜像的存储库。这可以通过 Red Hat Quay UI 或 Red Hat Quay API (如果您有 OAuth 令牌)来完成。

4.1. 使用 UI 创建机构

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

流程

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

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

4.2. 使用 Red Hat Quay API 创建机构

使用以下步骤使用 Red Hat Quay API 创建新机构。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 POST /api/v1/organization/ 端点创建新机构:

    $ curl -X POST   -H "Authorization: Bearer <bearer_token>" -H "Content-Type: application/json"   -d '{
        "name": "<new_organization_name>"
      }'   "https://<quay-server.example.com>/api/v1/organization/"

    输出示例

    "Created"
  2. 创建后,可以更改机构详情,如添加电子邮件地址,带有 PUT /api/v1/organization/{orgname} 命令。例如:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/organization/<orgname>" \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
            "email": "<org_email>",
            "invoice_email": <true/false>,
            "invoice_email_address": "<billing_email>"
          }'

    输出示例

    {"name": "test", "email": "new-contact@test-org.com", "avatar": {"name": "test", "hash": "a15d479002b20f211568fd4419e76686d2b88a4980a5b4c4bc10420776c5f6fe", "color": "#aec7e8", "kind": "user"}, "is_admin": true, "is_member": true, "teams": {"owners": {"name": "owners", "description": "", "role": "admin", "avatar": {"name": "owners", "hash": "6f0e3a8c0eb46e8834b43b03374ece43a030621d92a7437beb48f871e90f8d90", "color": "#c7c7c7", "kind": "team"}, "can_view": true, "repo_count": 0, "member_count": 1, "is_synced": false}}, "ordered_teams": ["owners"], "invoice_email": true, "invoice_email_address": "billing@test-org.com", "tag_expiration_s": 1209600, "is_free_account": true, "quotas": [{"id": 2, "limit_bytes": 10737418240, "limits": [{"id": 1, "type": "Reject", "limit_percent": 90}]}], "quota_report": {"quota_bytes": 0, "configured_quota": 10737418240, "running_backfill": "complete", "backfill_status": "complete"}}

4.3. 机构设置

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

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

流程

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

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

4.4. 使用 UI 删除机构

使用以下步骤使用 v2 UI 删除机构。

流程

  1. Organizations 页面上,选择您要删除的机构的名称,如 testorg
  2. More Actions 下拉菜单。
  3. Delete

    注意

    Delete 页面中,有一个 搜索 输入框。有了此框,用户可以搜索特定的组织,以确保它们被正确地安排删除。例如,如果用户正在删除 10 个机构,并希望确保删除了一个特定的机构,他们可以使用 搜索 输入框确认机构标记为删除。

  4. 通过在框中输入 confirm 确认您要永久删除组织。
  5. Delete

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

    注意

    您可以通过选择多个机构,然后点 More ActionsDelete 一次删除多个机构。

4.5. 使用 Red Hat Quay API 删除机构

使用以下步骤使用 Red Hat Quay API 删除机构。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 DELETE /api/v1/organization/{orgname} 端点删除机构:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      "https://<quay-server.example.com>/api/v1/organization/<organization_name>"
  2. 从 CLI 删除机构时,CLI 不会返回信息。要确认删除操作,您可以检查 Red Hat Quay UI,或者您可以输入 GET /api/v1/organization/{orgname} 命令来查看是否返回已删除机构的详情:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>"

    输出示例

    {"detail": "Not Found", "error_message": "Not Found", "error_type": "not_found", "title": "not_found", "type": "http://<quay-server.example.com>/api/v1/error/not_found", "status": 404}

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

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

仓库按命名空间组织。每个命名空间可以有多个软件仓库。例如,您可能有一个个人项目的命名空间、一个用于公司的命名空间,或针对您所在机构的特定团队有一个命名空间。

Red Hat Quay 为用户提供其存储库的访问控制。用户可以公开存储库,这意味着任何人都可以拉取或下载,或者用户可从中拉取或下载镜像,或者用户可以对其进行私有,并限制对授权用户或团队的访问。

在 Red Hat Quay 中创建软件仓库的方法有三种:通过使用 Red Hat Quay UI 推送镜像,或使用 Red Hat Quay API。同样,可以使用 UI 或正确的 API 端点来删除存储库。

5.1. 使用 UI 创建存储库

使用以下步骤使用 Red Hat Quay 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

    现在,您的示例存储库应在 Repositories 页面下填充。

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

5.2. 使用 Podman 创建软件仓库

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

通过推送镜像来创建镜像存储库。

先决条件

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

流程

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

    $ sudo podman pull busybox

    输出示例

    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

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

    $ sudo podman tag docker.io/library/busybox quay-server.example.com/quayadmin/busybox:test
  3. 将镜像推送到 registry。执行此步骤,您可以使用浏览器在存储库中查看标记的镜像。

    $ sudo podman push --tls-verify=false quay-server.example.com/quayadmin/busybox:test

    输出示例

    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures

5.3. 使用 API 创建存储库

使用以下步骤使用 Red Hat Quay API 创建镜像存储库。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 POST /api/v1/repository 端点创建存储库:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -d '{
        "repository": "<new_repository_name>",
        "visibility": "<private>",
        "description": "<This is a description of the new repository>."
      }' \
      "https://quay-server.example.com/api/v1/repository"

    输出示例

    {"namespace": "quayadmin", "name": "<new_repository_name>", "kind": "image"}

5.4. 使用 UI 删除存储库

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

先决条件

  • 您已创建了一个存储库。

流程

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

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

5.5. 使用 Red Hat Quay API 删除软件仓库

使用以下步骤使用 Red Hat Quay API 删除存储库。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 DELETE /api/v1/repository/{repository} 端点删除存储库:

    $ curl -X DELETE   -H "Authorization: Bearer <bearer_token>" "<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>"
  2. 从 CLI 删除存储库时,CLI 不会返回信息。要确认删除操作,您可以检查 Red Hat Quay UI,或者您可以输入以下 GET /api/v1/repository/{repository} 命令来查看是否返回已删除存储库的详情:

    $ curl -X GET -H "Authorization: Bearer <bearer_token>" "<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>"

    输出示例

    {"detail": "Not Found", "error_message": "Not Found", "error_type": "not_found", "title": "not_found", "type": "http://quay-server.example.com/api/v1/error/not_found", "status": 404}

第 6 章 Red Hat Quay Robot 帐户概述

机器人帐户用于设置对 Red Hat Quay registry 中存储库的自动访问。它们与 OpenShift Container Platform 服务帐户类似。

设置 Robot 帐户结果如下:

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

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

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

6.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 权限
  9. 可选。您可以点击机器人帐户的名称来获取以下信息:

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

6.2. 使用 Red Hat Quay API 创建机器人帐户

使用以下步骤使用 Red Hat Quay API 创建机器人帐户。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  • 输入以下命令,使用 PUT /api/v1/organization/{orgname}/robots/{robot_shortname} 端点为机构创建新的机器人帐户:

    $ curl -X PUT   -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/organization/<organization_name>/robots/<robot_name>"

    输出示例

    {"name": "orgname+robot-name", "created": "Fri, 10 May 2024 15:11:00 -0000", "last_accessed": null, "description": "", "token": "<example_secret>", "unstructured_metadata": null}
  • 输入以下命令为当前用户创建一个新的机器人帐户,其 PUT /api/v1/user/robots/{robot_shortname} 端点:

    $ curl -X PUT   -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/user/robots/<robot_name>"

    输出示例

    {"name": "quayadmin+robot-name", "created": "Fri, 10 May 2024 15:24:57 -0000", "last_accessed": null, "description": "", "token": "<example_secret>", "unstructured_metadata": null}

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

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

先决条件

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

流程

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

    Set repository permissions

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

6.4. 使用 UI 禁用机器人帐户

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

重要

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

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

先决条件

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

流程

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

    ROBOTS_DISALLOW: true
  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>

    返回以下出错信息:

    Error: logging into "<quay-server.example.com>": invalid username/password
  2. 您可以传递 log-level=debug 标志,以确认机器人帐户已被取消激活:

    $ podman login -u="<organization-name/username>+<robot-name>" -p="KETJ6VN0WT8YLLNXUJJ4454ZI6TZJ98NV41OE02PC2IQXVXRFQ1EJ36V12345678" --log-level=debug <quay-server.example.com>
    ...
    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.

6.5. 使用 Red Hat Quay API 重新生成机器人令牌

使用以下步骤使用 Red Hat Quay API 重新生成机器人帐户令牌。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  • 输入以下命令,使用 POST /api/v1/organization/{orgname}/robots/{robot_shortname}/regenerate 端点为机构重新生成机器人令牌:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/organization/<orgname>/robots/<robot_shortname>/regenerate"

    输出示例

    {"name": "test-org+test", "created": "Fri, 10 May 2024 17:46:02 -0000", "last_accessed": null, "description": "", "token": "<example_secret>"}

  • 输入以下命令,使用 POST /api/v1/user/robots/{robot_shortname}/regenerate 端点为当前用户重新生成机器人令牌:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>/regenerate"

    输出示例

    {"name": "quayadmin+test", "created": "Fri, 10 May 2024 14:12:11 -0000", "last_accessed": null, "description": "", "token": "<example_secret>"}

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

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

流程

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

6.7. 使用 Red Hat Quay API 删除机器人帐户

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

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令,使用 DELETE /api/v1/organization/{orgname}/robots/{robot_shortname} 端点删除机构的机器人帐户:

    curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/robots/<robot_shortname>"
  2. 在使用 API 删除机器人帐户时,CLI 不会返回信息。要确认删除操作,您可以检查 Red Hat Quay UI,或者您可以输入以下 GET /api/v1/organization/{orgname}/robots 命令,以查看是否为机器人帐户返回详情:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   "https://<quay-server.example.com>/api/v1/organization/<organization_name>/robots"

    输出示例

    {"robots": []}
  3. 输入以下命令,使用 DELETE /api/v1/user/robots/{robot_shortname} 端点删除当前用户的机器人帐户:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>"
  4. 在使用 API 删除当前用户的机器人帐户时,CLI 不会返回信息。要确认删除操作,您可以检查 Red Hat Quay UI,或者您可以输入以下 GET /api/v1/user/robots/{robot_shortname} 命令,以查看是否为机器人帐户返回详情:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>"

    输出示例

    {"message":"Could not find robot with specified username"}

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

在以前的 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 令牌。

6.8.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
  2. 在网页浏览器中,导航到以下 URL:

    http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
  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

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

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

    这是只能一次使用的临时代码。如果需要,您可以刷新页面或重新访问 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
    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"}

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

6.8.2. 使用 Red Hat Quay v2 UI 设置机器人帐户联邦

以下流程演示了如何使用 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

6.8.3. 为 Red Hat Quay 机器人令牌交换 OAuth2 访问令牌

以下流程利用 上一步中生成的访问令牌 来创建新的 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)
    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...
  3. 输入以下命令运行 robot_fed_token_auth.py 脚本:

    $ python3 robot_fed_token_auth.py

    输出示例

    <Response [200]>
    {"token": "291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ..."}

    重要

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

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

    $ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ

6.8.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
  2. 从机器人帐户具有正确权限的 Red Hat Quay 存储库拉取镜像。例如:

    $ podman pull <quay-server.example.com/<repository_name>/<image_name>>

    输出示例

    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

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

    $ podman pull <quay-server.example.com/<different_repository_name>/<image_name>>

    输出示例

    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

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

第 7 章 访问 Red Hat Quay 管理

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

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

7.1. Red Hat Quay 团队概述

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

7.1.1. 使用 UI 创建团队

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

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

先决条件

  • 您已创建了一个机构。

流程

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

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

7.1.2. 使用 API 创建团队

当使用 API 为机构创建团队时,您可以选择团队名称,选择哪个仓库可供团队使用,并决定团队的访问级别。

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

先决条件

  • 您已创建了一个机构。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下 PUT /api/v1/organization/{orgname}/team/{teamname} 命令,为您的机构创建一个团队:

    $ curl -k -X PUT -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer <bearer_token>"  --data '{"role": "creator"}' https://<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>

    输出示例

    {"name": "example_team", "description": "", "can_view": true, "role": "creator", "avatar": {"name": "example_team", "hash": "dec209fd7312a2284b689d4db3135e2846f27e0f40fa126776a0ce17366bc989", "color": "#e7ba52", "kind": "team"}, "new_team": true}

7.1.3. 使用 UI 管理团队

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

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

使用组织的管理特权,您可以将用户和机器人帐户添加到团队中。当您添加用户时,Red Hat Quay 会向该用户发送电子邮件。用户会一直处于待处理状态,直到他们接受邀请。

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

流程

  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. 单击添加成员
7.1.3.2. 使用 UI 设置团队角色

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

先决条件

  • 您已创建了团队。

流程

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

    Set the role that a team has within an organization

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

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

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

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

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

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

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

流程

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

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

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

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

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

7.1.4.1. 使用 API 管理团队成员和存储库权限

使用以下步骤将成员添加到团队(直接邀请或通过电子邮件),或者从团队中删除成员。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  • 输入 PUT /api/v1/organization/{orgname}/team/{teamname}/members/{membername} 命令,将成员添加到现有团队中:

    $ curl -X PUT \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"

    输出示例

    {"name": "testuser", "kind": "user", "is_robot": false, "avatar": {"name": "testuser", "hash": "d51d17303dc3271ac3266fb332d7df919bab882bbfc7199d2017a4daac8979f0", "color": "#5254a3", "kind": "user"}, "invited": false}

  • 输入 DELETE /api/v1/organization/{orgname}/team/{teamname}/members/{membername} 命令删除团队的成员:

    $ curl -X DELETE \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"

    此命令不会在 CLI 中输出。为确保成员已被删除,您可以输入 GET /api/v1/organization/{orgname}/team/{teamname}/members 命令,并确保输出中不会返回成员。

    $ curl -X GET \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members"

    输出示例

    {"name": "owners", "members": [{"name": "quayadmin", "kind": "user", "is_robot": false, "avatar": {"name": "quayadmin", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}, "invited": false}, {"name": "test-org+test", "kind": "user", "is_robot": true, "avatar": {"name": "test-org+test", "hash": "aa85264436fe9839e7160bf349100a9b71403a5e9ec684d5b5e9571f6c821370", "color": "#8c564b", "kind": "robot"}, "invited": false}], "can_edit": true}

  • 您可以输入 PUT /api/v1/organization/{orgname}/team/{teamname}/invite/{email} 命令以通过电子邮件地址向现有团队邀请用户:

    $ curl -X PUT \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"
  • 您可以输入 DELETE /api/v1/organization/{orgname}/team/{teamname}/invite/{email} 命令来删除电子邮件地址邀请来加入团队。例如:

    $ curl -X DELETE \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"
7.1.4.2. 使用 API 设置机构中团队的角色

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

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  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"

    输出示例

    {"permissions": [{"repository": {"name": "api-repo", "is_public": true}, "role": "admin"}]}

  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>"

    输出示例

    {"name": "testteam", "description": "", "can_view": true, "role": "creator", "avatar": {"name": "testteam", "hash": "827f8c5762148d7e85402495b126e0a18b9b168170416ed04b49aae551099dc8", "color": "#ff7f0e", "kind": "team"}, "new_team": false}

7.1.4.3. 使用 API 删除机构中的团队

使用以下步骤使用 API 删除机构中的团队。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  • 您可以通过输入 DELETE /api/v1/organization/{orgname}/team/{teamname} 命令删除机构中的团队:

    $ curl -X DELETE \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>"

    此命令不会在 CLI 中返回输出。

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

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

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

流程

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

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

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

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

7.3. 使用 API 创建和管理默认权限

使用以下步骤通过 Red Hat Quay API 管理默认权限。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下命令使用 POST /api/v1/organization/{orgname}/prototypes 端点创建默认权限:

    $ curl -X POST   -H "Authorization: Bearer <bearer_token>"   -H "Content-Type: application/json"   --data '{
        "role": "<admin_read_or_write>",
        "delegate": {
          "name": "<username>",
          "kind": "user"
        },
        "activating_user": {
          "name": "<robot_name>"
        }
      }'   https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes

    输出示例

    {"activating_user": {"name": "test-org+test", "is_robot": true, "kind": "user", "is_org_member": true, "avatar": {"name": "test-org+test", "hash": "aa85264436fe9839e7160bf349100a9b71403a5e9ec684d5b5e9571f6c821370", "color": "#8c564b", "kind": "robot"}}, "delegate": {"name": "testuser", "is_robot": false, "kind": "user", "is_org_member": false, "avatar": {"name": "testuser", "hash": "f660ab912ec121d1b1e928a0bb4bc61b15f5ad44d5efdc4e1c92a25e99b8e44a", "color": "#6b6ecf", "kind": "user"}}, "role": "admin", "id": "977dc2bc-bc75-411d-82b3-604e5b79a493"}

  2. 输入以下命令,使用 PUT /api/v1/organization/{orgname}/prototypes/{prototypeid} 端点更新默认权限,例如,如果要更改权限类型。您必须包含创建策略时返回的 ID。

    $ curl -X PUT \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "role": "write"
      }' \
      https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes/<prototypeid>

    输出示例

    {"activating_user": {"name": "test-org+test", "is_robot": true, "kind": "user", "is_org_member": true, "avatar": {"name": "test-org+test", "hash": "aa85264436fe9839e7160bf349100a9b71403a5e9ec684d5b5e9571f6c821370", "color": "#8c564b", "kind": "robot"}}, "delegate": {"name": "testuser", "is_robot": false, "kind": "user", "is_org_member": false, "avatar": {"name": "testuser", "hash": "f660ab912ec121d1b1e928a0bb4bc61b15f5ad44d5efdc4e1c92a25e99b8e44a", "color": "#6b6ecf", "kind": "user"}}, "role": "write", "id": "977dc2bc-bc75-411d-82b3-604e5b79a493"}

  3. 您可以通过输入 DELETE /api/v1/organization/{orgname}/prototypes/{prototypeid} 命令删除权限:

    curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes/<prototype_id>

    此命令不会返回输出。您可以通过输入 GET /api/v1/organization/{orgname}/prototypes 命令来获取所有权限的列表:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes

    输出示例

    {"prototypes": []}

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

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

先决条件

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

流程

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

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

7.5. 使用 API 调整存储库的访问设置

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

先决条件

  • 您已创建了用户帐户或机器人帐户。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 输入以下 PUT /api/v1/repository/{repository}/permissions/user/{username} 命令更改用户权限:

    $ curl -X PUT \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -d '{"role": "admin"}' \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>

    输出示例

    {"role": "admin", "name": "quayadmin+test", "is_robot": true, "avatar": {"name": "quayadmin+test", "hash": "ca9afae0a9d3ca322fc8a7a866e8476dd6c98de543decd186ae090e420a88feb", "color": "#8c564b", "kind": "robot"}}

  2. 要删除当前权限,您可以输入 DELETE /api/v1/repository/{repository}/permissions/user/{username} 命令:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>

    此命令不会返回 CLI 中的任何输出。反之,您可以通过输入 GET /api/v1/repository/{repository}/permissions/user/ 命令来检查权限是否已删除:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>/

    输出示例

    {"message":"User does not have permission for repo."}

第 8 章 镜像标签概述

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

镜像标签具有以下优点:

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

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

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

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

先决条件

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

流程

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

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

8.2. 使用 API 查看镜像标签信息

使用 API 查看镜像标签信息

先决条件

  • 您已将镜像标签推送到 Red Hat Quay 存储库。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 要获取标签信息,您必须使用 GET /api/v1/repository/{repository} API 端点并传递 includeTags 参数。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>?includeTags=true

    输出示例

    {"namespace": "quayadmin", "name": "busybox", "kind": "image", "description": null, "is_public": false, "is_organization": false, "is_starred": false, "status_token": "d8f5e074-690a-46d7-83c8-8d4e3d3d0715", "trust_enabled": false, "tag_expiration_s": 1209600, "is_free_account": true, "state": "NORMAL", "tags": {"example": {"name": "example", "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000", "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d"}, "test": {"name": "test", "size": 2275314, "last_modified": "Tue, 14 May 2024 14:04:48 -0000", "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d"}}, "can_write": true, "can_admin": true}

  2. 或者,您可以使用 GET /api/v1/repository/{repository}/tag/ 端点。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/

    输出示例

    {"tags": [{"name": "test-two", "reversion": true, "start_ts": 1718737153, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 18 Jun 2024 18:59:13 -0000"}, {"name": "test-two", "reversion": false, "start_ts": 1718737029, "end_ts": 1718737153, "manifest_digest": "sha256:0cd3dd6236e246b349e63f76ce5f150e7cd5dbf2f2f1f88dbd734430418dbaea", "is_manifest_list": false, "size": 2275317, "last_modified": "Tue, 18 Jun 2024 18:57:09 -0000", "expiration": "Tue, 18 Jun 2024 18:59:13 -0000"}, {"name": "test-two", "reversion": false, "start_ts": 1718737018, "end_ts": 1718737029, "manifest_digest": "sha256:0cd3dd6236e246b349e63f76ce5f150e7cd5dbf2f2f1f88dbd734430418dbaea", "is_manifest_list": false, "size": 2275317, "last_modified": "Tue, 18 Jun 2024 18:56:58 -0000", "expiration": "Tue, 18 Jun 2024 18:57:09 -0000"}, {"name": "sample_tag", "reversion": false, "start_ts": 1718736147, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 18 Jun 2024 18:42:27 -0000"}, {"name": "test-two", "reversion": false, "start_ts": 1717680780, "end_ts": 1718737018, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Thu, 06 Jun 2024 13:33:00 -0000", "expiration": "Tue, 18 Jun 2024 18:56:58 -0000"}, {"name": "tag-test", "reversion": false, "start_ts": 1717680378, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Thu, 06 Jun 2024 13:26:18 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000"}], "page": 1, "has_additional": false}

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

您可以向 Red Hat Quay 中的镜像添加新标签。

流程

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

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

8.4. 使用 API 将新标签添加到镜像标签到镜像

您可以使用 API 将新标签或恢复旧标签到镜像。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 您可以使用 PUT /api/v1/repository/{repository}/tag/{tag} 命令更改标签指向或创建新标签:

    $ curl -X PUT \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "manifest_digest": "<manifest_digest>"
      }' \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/<tag>

    输出示例

    "Updated"

  2. 您可以使用 POST /api/v1/repository/{repository}/tag/{tag}/restore 命令将存储库标签恢复到以前的镜像。例如:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "manifest_digest": <manifest_digest>
      }' \
      quay-server.example.com/api/v1/repository/quayadmin/busybox/tag/test/restore

    输出示例

    {}

  3. 要在创建新标签后查看标签列表,您可以使用 GET /api/v1/repository/{repository}/tag/ 命令。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
       https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag

    输出示例

    {"tags": [{"name": "test", "reversion": false, "start_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715697708, "end_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:41:48 -0000", "expiration": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715695488, "end_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:04:48 -0000", "expiration": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715631517, "end_ts": 1715695488, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Mon, 13 May 2024 20:18:37 -0000", "expiration": "Tue, 14 May 2024 14:04:48 -0000"}], "page": 1, "has_additional": false}

8.5. 使用 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,必须为由 = 分隔的键值

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

8.6. 使用 API 添加和删除标签

Red Hat Quay 管理员可以按照以下流程通过 API 为标签添加和管理标签。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 使用 GET /api/v1/repository/{repository}/manifest/{manifestref} 命令检索存储库中特定清单的详细信息:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>
  2. 使用 GET /api/v1/repository/{repository}/manifest/{manifestref}/labels 命令检索特定清单的标签列表:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels

    输出示例

    {"labels": [{"id": "e9f717d2-c1dd-4626-802d-733a029d17ad", "key": "org.opencontainers.image.url", "value": "https://github.com/docker-library/busybox", "source_type": "manifest", "media_type": "text/plain"}, {"id": "2d34ec64-4051-43ad-ae06-d5f81003576a", "key": "org.opencontainers.image.version", "value": "1.36.1-glibc", "source_type": "manifest", "media_type": "text/plain"}]}

  3. 使用 GET /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid} 命令获取有关特定清单的信息:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<label_id>

    输出示例

    {"id": "e9f717d2-c1dd-4626-802d-733a029d17ad", "key": "org.opencontainers.image.url", "value": "https://github.com/docker-library/busybox", "source_type": "manifest", "media_type": "text/plain"}

  4. 您可以使用 POST /api/v1/repository/{repository}/manifest/{manifestref}/labels 命令在给定存储库中向清单添加额外标签。例如:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "key": "<key>",
        "value": "<value>",
        "media_type": "<media_type>"
      }' \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels

    输出示例

    {"label": {"id": "346593fd-18c8-49db-854f-4cb1fb76ff9c", "key": "example-key", "value": "example-value", "source_type": "api", "media_type": "text/plain"}}

  5. 您可以使用 DELETE /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid} 命令删除标签:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<labelid>

    此命令不会在 CLI 中返回输出。您可以使用以上其中一个命令来确保它已被成功删除。

8.7. 设置标签过期

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

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

Red Hat Quay 超级用户没有与从用户存储库中删除过期镜像相关的特殊权限。超级用户没有中央机制来收集信息并针对用户存储库执行操作。每个存储库的所有者是管理过期和删除其镜像的所有者。

可以通过以下两种方式之一设置标签过期:

  • 在创建镜像时,通过在 Dockerfile 中设置 quay.expires-after= 标签。这将设置从构建镜像时过期的时间。
  • 通过选择 Red Hat Quay UI 上的过期日期。例如:

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

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

8.7.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

8.7.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>

8.7.3. 使用 API 设置标签过期

可以使用 API 将镜像标签设置为过期。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  • 您可以使用 PUT /api/v1/repository/{repository}/tag/{tag} 命令并传递 expiration 字段来设置标签过期:

    $ curl -X PUT \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "manifest_digest": "<manifest_digest>"
      }' \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/<tag>

    输出示例

    "Updated"

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

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

流程

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

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

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

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

    $ podman pull quay-server.example.com/quayadmin/busybox:test2

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

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

流程

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

    • 根据标签名称搜索
    • 选择日期范围
    • 查看标签更改
    • 查看标签修改日期及其更改的时间

8.10. 使用 API 查看 Red Hat Quay 标签历史记录

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

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 使用以下命令,使用 GET /api/v1/repository/{repository}/tag/ 命令查看标签历史记录,并传递以下查询之一:

    • onlyActiveTags=<true/false&gt; : Filters to only include active tags。
    • page=<number > : 指定要检索的结果页数。
    • limit=<number > : 限制每个页面的结果数。
    • specificTag=<tag_name > :过滤标签,使其只包含具有指定名称的标签。

      $ curl -X GET \
        -H "Authorization: Bearer <bearer_token>" \
        -H "Accept: application/json" \
        "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/tag/?onlyActiveTags=true&page=1&limit=10"

      输出示例

      {"tags": [{"name": "test-two", "reversion": false, "start_ts": 1717680780, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Thu, 06 Jun 2024 13:33:00 -0000"}, {"name": "tag-test", "reversion": false, "start_ts": 1717680378, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Thu, 06 Jun 2024 13:26:18 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000"}], "page": 1, "has_additional": false}

  2. 通过使用 specificTag=<tag_name > 查询,您可以过滤特定标签的结果。例如:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "<quay-server.example.com>/api/v1/repository/quayadmin/busybox/tag/?onlyActiveTags=true&page=1&limit=20&specificTag=test-two"

    输出示例

    {"tags": [{"name": "test-two", "reversion": true, "start_ts": 1718737153, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 18 Jun 2024 18:59:13 -0000"}], "page": 1, "has_additional": false}

8.11. 删除镜像标签

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

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

流程

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

    注意

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

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

    注意

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

8.12. 使用 API 删除镜像

您可以使用 API 删除旧镜像标签。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 您可以使用 DELETE /api/v1/repository/{repository}/tag/{tag} 命令删除镜像标签:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/<tag>

    此命令不会在 CLI 中返回输出。继续下一步,以返回标签列表。

  2. 要在删除标签后查看标签列表,您可以使用 GET /api/v1/repository/{repository}/tag/ 命令。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
       https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag

    输出示例

    {"tags": [{"name": "test", "reversion": false, "start_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715697708, "end_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:41:48 -0000", "expiration": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715695488, "end_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:04:48 -0000", "expiration": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715631517, "end_ts": 1715695488, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Mon, 13 May 2024 20:18:37 -0000", "expiration": "Tue, 14 May 2024 14:04:48 -0000"}], "page": 1, "has_additional": false}

8.13. 使用 UI 恢复标签更改

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

流程

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

8.14. 使用 API 恢复标签更改

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

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 您可以使用 POST /api/v1/repository/{repository}/tag/{tag}/restore 命令将存储库标签恢复到以前的镜像。例如:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "manifest_digest": <manifest_digest>
      }' \
      quay-server.example.com/api/v1/repository/quayadmin/busybox/tag/test/restore

    输出示例

    {}

  2. 要在恢复旧标签后查看标签列表,您可以使用 GET /api/v1/repository/{repository}/tag/ 命令。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
       https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag

    输出示例

    {"tags": [{"name": "test", "reversion": false, "start_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "example", "reversion": false, "start_ts": 1715697708, "end_ts": 1715698131, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:41:48 -0000", "expiration": "Tue, 14 May 2024 14:48:51 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715695488, "end_ts": 1716324069, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Tue, 14 May 2024 14:04:48 -0000", "expiration": "Tue, 21 May 2024 20:41:09 -0000"}, {"name": "test", "reversion": false, "start_ts": 1715631517, "end_ts": 1715695488, "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d", "is_manifest_list": false, "size": 2275314, "last_modified": "Mon, 13 May 2024 20:18:37 -0000", "expiration": "Tue, 14 May 2024 14:04:48 -0000"}], "page": 1, "has_additional": false}

第 9 章 查看和导出日志

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

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

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

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

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

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

注意

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

9.1. 查看使用日志

日志可以提供关于使用 registry 的方法的宝贵信息。可以通过 v2 UI 上的机构、存储库或命名空间来查看日志。

流程

  1. 登录到您的 Red Hat Quay registry。
  2. 导航到您作为管理员的 Organization、repository 或 namespace。
  3. Logs

    Logs page

  4. 可选。通过将日期添加到 FromTo 框来设置用于查看日志条目的日期范围。
  5. 可选。点 Export 来导出日志。您必须输入电子邮件地址或以 http://https:// 开头的有效回调 URL。根据存在多少个日志,此过程可能需要一小时。

9.2. 使用 API 查看使用日志

可以使用 API 查看机构或存储库的日志。它们也可以聚合(分组),或者列出包含更详细的信息。也可以由用户、特定日期范围或页面查看日志。

9.2.1. 查看聚合的日志

聚合的日志可由机构、存储库、特定用户或当前用户查看。您还可以传递可选命令,如 execute erstarttime/endtimenext_page 来过滤结果。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 使用 GET /api/v1/user/aggregatelogs API 端点为当前用户返回聚合(或分组)日志:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "https://<quay-server.example.com>/api/v1/user/aggregatelogs"

    输出示例

    {"aggregated": [{"kind": "create_tag", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "manifest_label_add", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "push_repo", "count": 2, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "revert_tag", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}]}

    您还可以传递执行者和 starttime/endtime 查询,以便在特定时间段内获取特定用户的聚合日志。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/user/aggregatelogs?performer=<username>&starttime=<MM/DD/YYYY>&endtime=<MM/DD/YYYY>"
  2. 机构也可以使用 GET /api/v1/organization/{orgname}/aggregatelogs 来查看聚合的日志。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/organization/{orgname}/aggregatelogs"
  3. 存储库也可以使用 GET /api/v1/repository/{repository}/aggregatelogs 命令查看聚合的日志。以下示例包括 starttime/endtime 字段:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/repository/<repository_name>/<namespace>/aggregatelogs?starttime=2024-01-01&endtime=2024-06-18""

9.2.2. 查看详细日志

详细日志可由机构、存储库、特定用户或当前用户查看。您还可以传递可选字段,如 executeer、starttime/endtimenext_page 来过滤结果。

流程

  1. 使用 GET /api/v1/user/logs API 端点返回用户的日志条目列表。例如:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "<quay-server.example.com>/api/v1/user/logs"

    您还可以传递执行者和 startime/endtime 查询,以便在特定时间段内获取特定用户的日志。例如:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "http://quay-server.example.com/api/v1/user/logs?performer=quayuser&starttime=01/01/2024&endtime=06/18/2024"

    输出示例

    ---
    {"start_time": "Mon, 01 Jan 2024 00:00:00 -0000", "end_time": "Wed, 19 Jun 2024 00:00:00 -0000", "logs": [{"kind": "revert_tag", "metadata": {"username": "quayuser", "repo": "busybox", "tag": "test-two", "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d"}, "ip": "192.168.1.131", "datetime": "Tue, 18 Jun 2024 18:59:13 -0000", "performer": {"kind": "user", "name": "quayuser", "is_robot": false, "avatar": {"name": "quayuser", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}}}, {"kind": "push_repo", "metadata": {"repo": "busybox", "namespace": "quayuser", "user-agent": "containers/5.30.1 (github.com/containers/image)", "tag": "test-two", "username": "quayuser", }
    ---

  2. 使用 GET /api/v1/organization/{orgname}/logs 端点返回指定机构的日志:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "http://<quay-server.example.com>/api/v1/organization/{orgname}/logs"
  3. 使用 GET /api/v1/repository/{repository}/logs 端点返回指定存储库的日志:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "http://<quay-server.example.com>/api/v1/repository/{repository}/logs"

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

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

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

使用以下步骤导出日志。

流程

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

    Enter email or callback URL to receive exported logs

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

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

URL 指向 Red Hat Quay 外部存储中的位置,并设置为在一小时内过期。如果要保留日志,请确保在过期时间之前复制导出的日志。

9.4. 使用 API 导出日志

详细日志可以导出到回调 URL 或电子邮件地址。

先决条件

  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  1. 使用 POST /api/v1/user/exportlogs 端点为当前用户导出日志:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "<MM/DD/YYYY>",
            "endtime": "<MM/DD/YYYY>",
            "callback_email": "your.email@example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/user/exportlogs"

    输出示例

    {"export_id": "6a0b9ea9-444c-4a19-9db8-113201c38cd4"}

  2. 使用 POST /api/v1/organization/{orgname}/exportlogs 端点导出机构的日志:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "<MM/DD/YYYY>",
            "endtime": "<MM/DD/YYYY>",
            "callback_email": "org.logs@example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/organization/{orgname}/exportlogs"
  3. 使用 POST /api/v1/repository/{repository}/exportlogs 端点导出存储库的日志:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "2024-01-01",
            "endtime": "2024-06-18",
            "callback_url": "http://your-callback-url.example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/repository/{repository}/exportlogs"

第 10 章 Clair 安全扫描

默认情况下,Red Hat Quay 不启用 Clair 安全扫描程序。要启用 Clair,请参阅 Red Hat Quay 上的 Clair

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

流程

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

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

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

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

流程

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

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

10.2. 使用 API 查看 Clair 安全扫描

您可以使用 API 查看 Clair 安全扫描。

流程

  • 使用 GET /api/v1/repository/{repository}/manifest/{manifestref}/security 端点来检索有关存储库中特定清单的安全信息。例如:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "https://quay-server.example.com/api/v1/repository/<namespace>/<repository>/manifest/<manifest_digest>/security?vulnerabilities=<true_or_false>"

    输出示例

    {"status": "queued", "data": null}

第 11 章 通知概述

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

11.1. 通知操作

通知添加到 Repository Settings 页面 的事件和通知 部分中。它们也添加到 通知 窗口中,可通过单击 Red Hat Quay 导航窗格中的 bell 图标找到。

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

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

电子邮件通知

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

Webhook POST 通知

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

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

Flowdock 通知

向 Flowdock 发送消息。

HipChat 通知

向 HipChat 发送消息。

Slack 通知

向 Slack 发送消息。

11.2. 使用 UI 创建通知

使用以下步骤添加通知。

先决条件

  • 您已创建了一个存储库。
  • 您有对该存储库的管理特权。

流程

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

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

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

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

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

11.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
    1
    默认情况下,此字段设置为 300 或 5 小时。

验证

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

    Test Notification Queued
    A test version of this notification has been queued and should appear shortly
  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"
    }

11.3. 使用 API 创建通知

使用以下步骤添加通知。

先决条件

  • 您已创建了一个存储库。
  • 您有对该存储库的管理特权。
  • 您已创建了 OAuth 访问令牌
  • 您已在 config.yaml 文件中设置了 BROWSER_API_CALLS_XHR_ONLY: false

流程

  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/

    此命令不会在 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}
  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

    输出示例

    {}

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

    此命令不会在 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

    输出示例

    {"notifications": []}

11.4. 仓库事件描述

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

repository Push

成功将一个或多个镜像推送(push)到存储库:

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

以下示例是 Dockerfile 构建的响应,该构建已排队到 Build 系统。

注意

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

{
  "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"
}
Dockerfile 构建已启动

以下示例是 Dockerfile 构建的响应,该构建已排队到 Build 系统。

注意

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

{
  "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"
}
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"
  ]
}
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"
}
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"
}
检测到漏洞

以下示例是 Dockerfile 构建的响应,已检测到存储库中的漏洞。

{
  "repository": "dgangaia/repository",
  "namespace": "dgangaia",
  "name": "repository",
  "docker_url": "quay.io/dgangaia/repository",
  "homepage": "https://quay.io/repository/dgangaia/repository",

  "tags": ["latest", "othertag"],

  "vulnerability": {
    "id": "CVE-1234-5678",
    "description": "This is a bad vulnerability",
    "link": "http://url/to/vuln/info",
    "priority": "Critical",
    "has_fix": true
  }
}

第 12 章 在 OpenShift Container Platform 上使用 Red Hat Quay 构建裸机

构建功能的文档 已移到 Builder 和镜像自动化 中。本章将在以后的 Red Hat Quay 版本中删除。

第 13 章 Red Hat Quay 配额管理和强制概述

使用 Red Hat Quay,用户可以通过建立配置的存储配额限制来报告存储消耗并包含 registry 增长。内部 Red Hat Quay 用户现在带有以下功能来管理其环境的容量限制:

  • 配额报告: 借助此功能,超级用户可以跟踪其所有组织的存储消耗。此外,用户可以跟踪其分配组织的存储消耗。
  • 配额管理: 利用此功能,超级用户可以为 Red Hat Quay 用户定义软和硬检查。软检查告知用户是否存储消耗达到其配置阈值。硬检查可防止用户在存储消耗达到配置的限制时推送到 registry。

这些功能一起允许 Red Hat Quay registry 的服务所有者定义服务级别协议并支持健康的资源预算。

13.1. 配额管理架构

启用配额管理功能后,单独的 blob 大小在存储库和命名空间级别总和。例如,如果同一存储库中的两个标签引用同一 blob,则该 Blob 的大小仅计算为仓库总计一次。另外,清单列表总数计算为存储库总计。

重要

因为清单列表总数被计算为仓库总计,所以从以前的 Red Hat Quay 版本升级时消耗的总配额可能会在 Red Hat Quay 3.9 中被报告不同。在某些情况下,新总数可能会超过存储库的之前设置的限制。Red Hat Quay 管理员可能需要调整存储库所分配的配额,以考虑这些更改。

配额管理功能的工作原理是,使用回填 worker 计算现有存储库和命名空间的大小,然后从总镜像添加或减去,这些镜像被推送或垃圾收集到每个镜像。另外,在收集清单时,从总的减法中减去。

注意

因为减法发生在清单垃圾回收时的总数,所以大小计算会有一个延迟,直到它能够收集垃圾回收为止。有关垃圾回收的更多信息,请参阅 Red Hat Quay 垃圾回收

以下数据库表包含机构中 Red Hat Quay 仓库的配额存储库大小、配额命名空间大小和配额 registry 大小(以字节为单位):

  • QuotaRepositorySize
  • QuotaNameSpaceSize
  • QuotaRegistrySize

组织大小由回填 worker 计算,以确保不会重复。在初始化镜像推送时,系统会验证用户的机构存储,以检查它是否超过配置的配额限制。如果镜像推送超过定义的配额限制,则会发生软或硬检查:

  • 对于软检查,用户会被通知。
  • 对于硬检查,推送会被停止。

如果存储消耗在配置的配额限制内,则允许推送。

镜像清单删除遵循类似的流程,其中关联的镜像标签和清单之间的链接会被删除。另外,在镜像清单被删除后,会在 QuotaRepositorySizeQuotaNameSpaceSizeQuotaRegistrySize 表中重新计算和更新存储库大小。

13.2. 配额管理限制

配额管理可帮助组织维护资源消耗。配额管理的一个限制是,在推送时计算资源消耗会导致计算推送的关键路径的一部分。如果没有这种情况,使用量数据可能会偏移。

最大存储配额大小取决于所选数据库:

表 13.1. worker 计数环境变量
变量描述

Postgres

8388608 TB

MySQL

8388608 TB

SQL Server

16777216 TB

13.3. 配额管理配置字段

表 13.2. 配额管理配置
字段类型描述

FEATURE_QUOTA_MANAGEMENT

布尔值

为配额管理功能启用配置、缓存和验证。

**Default:** `False`

DEFAULT_SYSTEM_REJECT_QUOTA_BYTES

字符串

为所有机构启用系统默认配额拒绝字节允许。

默认情况下,不会设置限制。

QUOTA_BACKFILL

布尔值

启用配额回填工作程序来计算预先存在的 Blob 的大小。

默认:True

QUOTA_TOTAL_DELAY_SECONDS

字符串

启动配额回填的时间延迟。滚动部署可能会导致总部署不正确。此字段 必须设置为 超过滚动部署完成所需的时间。

默认 :1800

PERMANENTLY_DELETE_TAGS

布尔值

启用与从时间窗中删除标签相关的功能。

默认False

RESET_CHILD_MANIFEST_EXPIRATION

布尔值

重置以子清单为目标的临时标签的过期。将这个功能设置为 True 时,子清单会立即收集垃圾回收。

默认False

13.3.1. 配额管理配置示例

以下 YAML 是启用配额管理时推荐的配置。

配额管理 YAML 配置

FEATURE_QUOTA_MANAGEMENT: true
FEATURE_GARBAGE_COLLECTION: true
PERMANENTLY_DELETE_TAGS: true
QUOTA_TOTAL_DELAY_SECONDS: 1800
RESET_CHILD_MANIFEST_EXPIRATION: true

13.4. 使用 Red Hat Quay API 为机构建立配额

首次创建机构时,它没有建立的配额。您可以使用 API 检查、创建、更改或删除机构的配额限制。

先决条件

  • 您已生成了 OAuth 访问令牌。

流程

  1. 要为机构设置配额,您可以使用 POST /api/v1/organization/{orgname}/quota 端点:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
             "limit_bytes": 10737418240,
             "limits": "10 Gi"
         }'

    输出示例

    "Created"

  2. 使用 GET /api/v1/organization/{orgname}/quota 命令查看您的机构是否已建立的配额:

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq

    输出示例

    [{"id": 1, "limit_bytes": 10737418240, "limit": "10.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}]

  3. 您可以使用 PUT /api/v1/organization/{orgname}/quota/{quota_id} 命令修改现有的配额限制。例如:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
             "limit_bytes": <limit_in_bytes>
         }'

    输出示例

    {"id": 1, "limit_bytes": 21474836480, "limit": "20.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}

13.4.1. 推送镜像

要查看消耗的存储,请将各种镜像推送到机构。

13.4.1.1. 推送 ubuntu:18.04

从命令行将 ubuntu:18.04 推送到机构:

示例命令

$ podman pull ubuntu:18.04

$ podman tag docker.io/library/ubuntu:18.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

13.4.1.2. 使用 API 查看配额使用量

要查看消耗的存储,来自 /api/v1/repository 端点的 GET 数据:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true'  | jq

输出示例

{
  "repositories": [
    {
      "namespace": "testorg",
      "name": "ubuntu",
      "description": null,
      "is_public": false,
      "kind": "image",
      "state": "NORMAL",
      "quota_report": {
        "quota_bytes": 27959066,
        "configured_quota": 104857600
      },
      "last_modified": 1651225630,
      "popularity": 0,
      "is_starred": false
    }
  ]
}

13.4.1.3. 推送另一个镜像
  1. 拉取、标记和推送第二个镜像,如 nginx

    示例命令

    $ podman pull nginx
    
    $ podman tag docker.io/library/nginx example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx

  2. 要查看机构中存储库的配额报告,请使用 /api/v1/repository 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true'

    输出示例

    {
      "repositories": [
        {
          "namespace": "testorg",
          "name": "ubuntu",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 27959066,
            "configured_quota": 104857600
          },
          "last_modified": 1651225630,
          "popularity": 0,
          "is_starred": false
        },
        {
          "namespace": "testorg",
          "name": "nginx",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 59231659,
            "configured_quota": 104857600
          },
          "last_modified": 1651229507,
          "popularity": 0,
          "is_starred": false
        }
      ]
    }

  3. 要查看机构详情中的配额信息,请使用 /api/v1/organization/{orgname} 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg' | jq

    输出示例

    {
      "name": "testorg",
      ...
      "quotas": [
        {
          "id": 1,
          "limit_bytes": 104857600,
          "limits": []
        }
      ],
      "quota_report": {
        "quota_bytes": 87190725,
        "configured_quota": 104857600
      }
    }

13.4.2. 使用配额限制拒绝推送

如果镜像推送超过定义的配额限制,则会发生软或硬检查:

  • 对于软检查,或警告 ,用户会收到通知。
  • 对于硬检查 或拒绝,该推送将被终止。
13.4.2.1. 设置 reject 和 warning 限制

要设置 rejectwarning 限制,请将 POST 数据发送到 /api/v1/organization/{orgname}/quota/{quota_id}/limit 端点:

拒绝限制命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Reject","threshold_percent":80}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit

警告限制命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Warning","threshold_percent":50}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit

13.4.2.2. 查看拒绝和警告限制

要查看 rejectwarning 限制,请使用 /api/v1/organization/{orgname}/quota 端点:

查看配额限制

$  curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota | jq

配额限制的输出示例

[
  {
    "id": 1,
    "limit_bytes": 104857600,
    "default_config": false,
    "limits": [
      {
        "id": 2,
        "type": "Warning",
        "limit_percent": 50
      },
      {
        "id": 1,
        "type": "Reject",
        "limit_percent": 80
      }
    ],
    "default_config_exists": false
  }
]

13.4.2.3. 超过 reject 限值时推送镜像

在本例中,拒绝限制(80%)已设置为当前存储库大小(~83%)的下方,因此下一推送应自动拒绝。

从命令行将示例镜像推送到机构:

镜像推送示例

$ podman pull ubuntu:20.04

$ podman tag docker.io/library/ubuntu:20.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

超过配额时的输出示例

Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0002] failed, retrying in 1s ... (1/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0005] failed, retrying in 1s ... (2/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0009] failed, retrying in 1s ... (3/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace

13.4.2.4. 超过限制的通知

超过限制时,会出现一个通知:

配额通知

Quota notifications

第 14 章 Red Hat Quay 作为上游 registry 的代理缓存

随着容器开发日益普及,客户逐渐依赖 Docker 或 Google Cloud Platform 等上游 registry 中的容器镜像来启动和运行服务。现在,对于用户可以从这些 registry 中拉取的次数,registry 存在速率限制和节流。

通过此功能,Red Hat Quay 将充当代理缓存,以绕过上游 registry 的限制。添加缓存功能也会加快拉取性能,因为镜像是从缓存中拉取的,而不是从上游依赖项中提取。只有在上游镜像摘要与缓存的镜像不同时,才会更新缓存的镜像,从而减少速率限制和潜在的节流。

在 Red Hat Quay 缓存代理中,提供了以下功能:

  • 特定机构可以定义为上游 registry 的缓存。
  • 配置 Quay 组织,充当特定上游 registry 的缓存。此软件仓库可以通过 Quay UI 定义,并提供以下配置:

    • 私有存储库的上游 registry 凭证或提高速率限制。
    • 过期计时器以避免超过缓存机构大小。
  • 通过配置应用程序全局配置/关闭。
  • 整个上游 registry 缓存或只是一个命名空间,例如,所有 docker.io 或仅 docker.io/library
  • 会拉取所有缓存的日志记录。
  • Clair 的缓存镜像扫描功能。

14.1. 代理缓存架构

下图显示了代理缓存功能的预期设计流和架构。

Proxy cache overview

当用户从 Red Hat Quay 上的上游存储库拉取(如 postgres:14 )时,程序库会检查是否存在镜像。如果镜像不存在,则启动新的拉取。拉取后,镜像层将保存到同时缓存和服务器到用户。下图描述了这种情况的架构概述:

Pulled image overview

如果缓存中存在镜像,用户便可依赖 Quay 的缓存与上游源保持最新状态,以便自动拉取来自缓存的较新的镜像。当上游 registry 中已覆盖了原始镜像的标签时,会出现这种情况。下图描述了当上游镜像和缓存镜像版本不同的版本时会发生什么情况的架构概述:

Updating opposing layers overview

如果上游镜像和缓存的版本相同,则不会拉取任何层,并将缓存的镜像提供给用户。

在某些情况下,用户在上游 registry 关闭时启动拉取。如果这种情况与配置的陈旧期发生,则存储在缓存中的镜像。如果在配置的过时期限后发生拉取,则错误会传播到用户。下图显示了在配置的过时期限后拉取(pull)时的架构概述:

Staleness pull overview

Quay 管理员可以利用组织的可配置大小限制来限制缓存大小,以便后端存储消耗可以预测。实现方法是根据镜像使用的频率从缓存中丢弃镜像。下图描述了这种情况的架构概述:

14.2. 代理缓存限制

与 Red Hat Quay 进行代理缓存有以下限制:

  • 您的代理缓存的大小限制必须大于或等于您要缓存的镜像。例如,如果您的代理缓存机构的最大大小为 500 MB,而用户想拉取的镜像为 700 MB,则镜像将被缓存,并在配置的限制之外溢出。
  • 缓存的镜像必须具有与 Quay 存储库中的镜像相同的属性。
  • 目前,仅缓存客户端请求的层。

14.3. 使用 Red Hat Quay 代理远程 registry

以下流程描述了如何使用 Red Hat Quay 代理远程 registry。此流程设置为 proxy quay.io,它允许用户使用 podman 从 quay.io 上的任何命名空间拉取任何公共镜像。

先决条件

  • config.yaml 中的 FEATURE_PROXY_CACHE 设置为 true
  • 分配 Member 团队角色。如需有关团队角色的更多信息,请参阅 Red Hat Quay 中的用户和机构

流程

  1. 在 Red Hat Quay v2 UI 上,单击组织的名称,如 cache-org
  2. 在导航窗格中,单击 Settings
  3. Remote Registry 框中,输入要缓存的远程 registry 的名称,如 quay.io,然后点 Save

    注意

    通过在 远程 Registry 中添加命名空间,例如 quay.io/<namespace >,您的机构中的用户只能从该命名空间中代理。

  4. 可选。在 Remote Registry username 框中,输入用于向上一步中指定的远程 registry 进行身份验证的用户名。对于上游的匿名拉取,您可以将此留空。如果您在创建时设置用户名,则无法在不删除代理缓存和创建新 registry 的情况下添加用户名。
  5. 可选。在 Remote registry 密码 框中,输入要在远程 registry 中进行身份验证的密码。对于上游的匿名拉取,您可以将此留空。如果您在创建时设置用户名,则无法在不删除代理缓存和创建新 registry 的情况下添加用户名。
  6. 可选。在 Expiration 字段中设置一个时间。

    注意
    • 代理机构中缓存镜像的默认 tag Expiration 字段设置为 86400 秒。在代理机构中,每当拉取标签时,标签过期都会刷新到 UI 的 过期 项中设置的值。此功能与 Quay 的默认 单独标签过期 功能不同。在代理机构中,可以覆盖各个标签功能。发生这种情况时,根据代理机构的过期字段重置单个标签的 过期
    • 过期的镜像将在分配的时间后消失,但仍然存储在 Red Hat Quay 中。镜像被完全删除或收集的时间取决于机构的 Time Machine 设置。垃圾回收的默认时间为 14 天,除非另有指定。
  7. 可选。如果要使用不安全的协议,请选中 http 框。如果没有选中,则使用 https 来请求远程 registry。
  8. 点击 Save

验证

  1. 在 CLI 中,从指定的远程 registry (如 quay.io )拉取公共镜像,充当代理缓存:

    $ podman pull <registry_url>/<organization_name>/<quayio_namespace>/<image_name>
    重要

    如果您的组织被设置为从远程 registry 的单个命名空间中拉取,则必须在 URL 中省略远程 registry 命名空间。例如,podman pull <registry_url>/<organization_name>/<image_name>

14.3.1. 在代理机构中利用存储配额限制

在 Red Hat Quay 3.8 中,代理缓存功能通过标记的镜像自动运行功能进行了增强。只有经过代理的命名空间配置了配额限制时,才会提供自动镜像标签。目前,如果镜像大小大于组织的配额,则镜像会被跳过,直到管理员创建必要的空间。现在,当推送镜像超过分配的空间时,自动运行增强会标记最早使用的标签来删除。因此,存储了新镜像标签,而使用最少的镜像标签则标记为删除。

重要
  • 作为 auto-pruning 功能的一部分,标记为删除的标签最终由垃圾收集器(gc) worker 进程收集垃圾回收。因此,在此期间不会完全强制配额大小限制。
  • 目前,命名空间配额大小计算不会考虑 manifest 子大小。这是一个已知问题,它将在以后的 Red Hat Quay 版本中解决。
14.3.1.1. 在代理机构中测试存储配额限制功能

使用以下步骤测试启用了代理缓存和存储配额限制的机构的自动运行功能。

先决条件

  • 您的机构被配置为作为代理机构。以下来自 quay.io 的代理示例。
  • FEATURE_PROXY_CACHEconfig.yaml 文件中被设置为 true
  • FEATURE_QUOTA_MANAGEMENTconfig.yaml 文件中被设置为 true
  • 您的组织配置了配额限制,如 150 MB

流程

  1. 从代理机构拉取(pull)到您的仓库,例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.7.9
  2. 根据存储库中剩余的空间,您可能需要从代理机构拉取附加镜像,例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.6.2
  3. 在 Red Hat Quay registry UI 中,点存储库的名称。

    • 在导航窗格中,单击 Tags,并确保 quay:3.7.9quay:3.6.2 已标记。
  4. 拉取导致您的存储库超过分配配额的最后镜像,例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.5.1
  5. 刷新 Red Hat Quay registry 的 Tags 页面。您推送的第一个镜像,例如 quay:3.7.9 应该已被自动修剪。Tags 页面现在应当显示 quay:3.6.2quay:3.5.1

第 15 章 在 OpenShift Container Platform 上使用 Red Hat Quay 进行虚拟构建

构建功能的文档 已移到 Builder 和镜像自动化 中。本章将在以后的 Red Hat Quay 版本中删除。

第 16 章 开放容器项目支持

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

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

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

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

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

16.1. Helm 和 OCI 的先决条件

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

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

最新版本的 Helm 可以在 Helm releases 页面中下载。下载 Helm 后,您必须使您的系统信任 Red Hat Quay 使用的 SSL/TLS 证书。

16.1.1. 启用您的系统信任 Red Hat Quay 使用的 SSL/TLS 证书

通过 HTTPS 促进 Helm 客户端和 Red Hat Quay 之间的通信。从 Helm 3.5 开始,支持仅适用于通过 HTTPS 与可信证书通信的 registry。另外,操作系统必须信任 registry 公开的证书。您必须确保您的操作系统已配置为信任 Red Hat Quay 使用的证书。使用以下步骤使您的系统信任自定义证书。

流程

  1. 输入以下命令将 rootCA.pem 文件复制到 /etc/pki/ca-trust/source/anchors/ 文件夹:

    $ sudo cp rootCA.pem   /etc/pki/ca-trust/source/anchors/
  2. 输入以下命令更新 CA 信任存储:

    $ sudo update-ca-trust extract

16.2. 使用 Helm chart

使用以下示例,从红帽实践(CoP)仓库中下载和推送 etherpad chart。

先决条件

  • 您已登录到 Red Hat Quay。

流程

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

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

    $ helm repo update
  3. 输入以下命令从存储库拉取 chart:

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

    $ helm package ./etherpad

    输出示例

    Successfully packaged chart and saved it to: /home/user/linux-amd64/etherpad-0.0.4.tgz
  5. 使用 helm registry 登录 Red Hat Quay:

    $ helm registry login quay370.apps.quayperf370.perfscale.devcluster.openshift.com
  6. 使用 helm push 命令将 chart 推送到您的存储库:

    $ helm push etherpad-0.0.4.tgz oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com

    输出示例:

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

    $ rm -rf etherpad-0.0.4.tgz
    $ helm pull oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad --version 0.0.4

    输出示例:

    Pulled: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4
    Digest: sha256:4f627399685880daf30cf77b6026dc129034d68c7676c7e07020b70cf7130902

16.3. 注解解析

有些 OCI 介质类型不使用标签,因此不包括过期时间戳等重要信息。Red Hat Quay 支持通过注解传递的元数据来容纳没有将这些标签用于元数据传输的 OCI 介质类型。现在,可以使用 ORAS (OCI Registry 作为存储)来嵌入信息与工件类型,以帮助确保镜像正确运行,例如:

以下流程使用 ORAS 将过期日期添加到 OCI 介质工件中。

重要

如果您使用 podman push 推送镜像,然后使用 oras 添加注解,则 MIME 类型将改变。因此,您无法使用 podman pull 拉取相同的镜像,因为 Podman 无法识别 MIME 类型。

先决条件

流程

  • 默认情况下,一些 OCI 介质类型(如 application/vnd.oci.image.manifest.v1+json )不使用某些标签,如过期时间戳。您可以使用 ORAS (或 )等CLI 工具向 OCI 介质类型添加注解。例如:

    $ oras push --annotation "quay.expires-after=2d" \ 1
    --annotation "expiration = 2d" \ 2
    quay.io/<organization_name>/<repository>/<image_name>:<tag>
    1
    为 2 天设置过期时间,由 2d 表示。
    2
    添加 expiration 标签。

    输出示例

    ✓ Exists    application/vnd.oci.empty.v1+json                                                                                   2/2  B 100.00%     0s
      └─ sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
    ✓ Uploaded  application/vnd.oci.image.manifest.v1+json                                                                      561/561  B 100.00%  511ms
      └─ sha256:9b4f2d43b62534423894d077f0ff0e9e496540ec8b52b568ea8b757fc9e7996b
    Pushed [registry] quay.io/stevsmit/testorg3/oci-image:v1
    ArtifactType: application/vnd.unknown.artifact.v1
    Digest: sha256:9b4f2d43b62534423894d077f0ff0e9e496540ec8b52b568ea8b757fc9e7996b

验证

  1. 使用 或as 拉取镜像。例如:

    $ oras pull quay.io/<organization_name>/<repository>/<image_name>:<tag>
  2. 使用 oras 检查更改。例如:

    $ oras manifest fetch quay.io/<organization_name>/<repository>/<image_name>:<tag>

    输出示例

    {"schemaVersion":2,"mediaType":"application/vnd.oci.image.manifest.v1+json","artifactType":"application/vnd.unknown.artifact.v1","config":{"mediaType":"application/vnd.oci.empty.v1+json","digest":"sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","size":2,"data":"e30="},"layers":[{"mediaType":"application/vnd.oci.empty.v1+json","digest":"sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","size":2,"data":"e30="}],"annotations":{"org.opencontainers.image.created":"2024-07-11T15:22:42Z","version ":" 8.11"}}

16.4. 将引用附加到镜像标签

以下流程演示了如何使用 oras CLI 使用 OCI 发行版 spec 1.1 支持的不同模式将引用程序附加到镜像标签。这可用于为容器镜像附加和管理其他元数据,如引用者到容器镜像。

先决条件

流程

  1. 输入以下命令标记 OCI 介质工件:

    $ podman tag <myartifact_image> <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag>
  2. 将工件推送到 Red Hat Quay registry。例如:

    $ podman push <myartifact_image> <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag>
  3. 输入以下命令,使用带有 oras 的 OCI 1.1 引用 API 模式来附加清单:

    $ oras attach --artifact-type <MIME_type> --distribution-spec v1.1-referrers-api <myartifact_image> \
    <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag> \
    <example_file>.txt

    输出示例

    -spec v1.1-referrers-api quay.io/testorg3/myartifact-image:v1.0 hi.txt
    ✓ Exists    hi.txt                                                               3/3  B 100.00%     0s
      └─ sha256:98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4
    ✓ Exists    application/vnd.oci.empty.v1+json                                    2/2  B 100.00%     0s
      └─ sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
    ✓ Uploaded  application/vnd.oci.image.manifest.v1+json                       723/723  B 100.00%  677ms
      └─ sha256:31c38e6adcc59a3cfbd2ef971792aaf124cbde8118e25133e9f9c9c4cd1d00c6
    Attached to [registry] quay.io/testorg3/myartifact-image@sha256:db440c57edfad40c682f9186ab1c1075707ce7a6fdda24a89cb8c10eaad424da
    Digest: sha256:31c38e6adcc59a3cfbd2ef971792aaf124cbde8118e25133e9f9c9c4cd1d00c6

  4. 输入以下命令使用 OCI 1.1 引用器 标签 模式附加清单:

    $ oras attach --artifact-type <MIME_type> --distribution-spec v1.1-referrers-tag \
    <myartifact_image> <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag> \
    <example_file>.txt

    输出示例

    ✓ Exists    hi.txt                                                             3/3  B 100.00%     0s
      └─ sha256:98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4
    ✓ Exists    application/vnd.oci.empty.v1+json                                  2/2  B 100.00%     0s
      └─ sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
    ✓ Uploaded  application/vnd.oci.image.manifest.v1+json                     723/723  B 100.00%  465ms
      └─ sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383
    Attached to [registry] quay.io/testorg3/myartifact-image@sha256:db440c57edfad40c682f9186ab1c1075707ce7a6fdda24a89cb8c10eaad424da
    Digest: sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383

  5. 输入以下命令 使用标签 模式发现工件的引用器:

    $ oras discover --insecure --distribution-spec v1.1-referrers-tag \
    <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag>

    输出示例

    quay.io/testorg3/myartifact-image@sha256:db440c57edfad40c682f9186ab1c1075707ce7a6fdda24a89cb8c10eaad424da
    └── doc/example
        └── sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383

  6. 输入以下命令使用 API 模式发现工件的引用器:

    $ oras discover --distribution-spec v1.1-referrers-api \
    <quay-server.example.com>/<organization_name>/<repository>/<image_name>:<tag>

    输出示例

    Discovered 3 artifacts referencing v1.0
    Digest: sha256:db440c57edfad40c682f9186ab1c1075707ce7a6fdda24a89cb8c10eaad424da
    
    Artifact Type   Digest
                    sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383
                    sha256:22b7e167793808f83db66f7d35fbe0088b34560f34f8ead36019a4cc48fd346b
                    sha256:bb2b7e7c3a58fd9ba60349473b3a746f9fe78995a88cb329fc2fd1fd892ea4e4

  7. 可选。您还可以使用 /v2/<organization_name>/<repository_name>/referrers/<sha256_digest& gt; 端点来发现引用器。要实现此目的,您必须在 config.yaml 文件中生成 v2 API 令牌并设置 FEATURE_REFERRERS_API: true

    1. 更新 config.yaml 文件,使其包含 FEATURE_REFERRERS_API 字段。例如:

      # ...
      FEATURE_REFERRERS_API: true
      # ...
    2. 输入以下命令对凭证进行 Base64 编码:

      $ echo -n '<username>:<password>' | base64

      输出示例

      abcdeWFkbWluOjE5ODlraWROZXQxIQ==

    3. 输入以下命令使用 base64 编码的令牌,并将 URL 端点改为 Red Hat Quay 服务器:

      $ curl --location '<quay-server.example.com>/v2/auth?service=<quay-server.example.com>&scope=repository:quay/listocireferrs:pull,push' --header 'Authorization: Basic <base64_username:password_encode_token>' -k | jq

      输出示例

      {
        "token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijl5RWNtWmdiZ0l6czBBZW16emhTMHM1R0g2RDJnV2JGUTdUNGZYand4MlUiLCJ0eXAiOiJKV1QifQ..."
      }

  8. 输入以下命令使用 v2 API 令牌列出存储库下清单的 OCI 引用器:

    $ GET https://<quay-server.example.com>/v2/<organization_name>/<repository_name>/referrers/sha256:0de63ba2d98ab328218a1b6373def69ec0d0e7535866f50589111285f2bf3fb8
    --header 'Authorization: Bearer <v2_bearer_token> -k | jq

    输出示例

    {
      "schemaVersion": 2,
      "mediaType": "application/vnd.oci.image.index.v1+json",
      "manifests": [
        {
          "mediaType": "application/vnd.oci.image.manifest.v1+json",
          "digest": "sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383",
          "size": 793
        },
      ]
    }

法律通告

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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.