使用 Red Hat Quay


Red Hat Quay 3.14

使用 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. 单击 "更改密码 "。
  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/ 端点来创建新用户:

    Copy to Clipboard Toggle word wrap
    $ 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/"

    输出示例

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

    Copy to Clipboard Toggle word wrap
    $ podman login <quay-server.example.com>

    输出示例

    Copy to Clipboard Toggle word wrap
    username: newuser
    password: 123456789

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

    Copy to Clipboard Toggle word wrap
    $ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/users/"
    注意

    如果 config.yaml 文件中设置了 AUTHENTICATION_TYPE: DatabaseGET /api/v1/superuser/users/ 端点才会返回用户和超级用户。它不适用于 LDAP 身份验证类型。

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令,以从命令行删除用户:

    Copy to Clipboard Toggle word wrap
    $ 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。然后您可以检查是否存在它们。

    注意

    如果 config.yaml 文件中设置了 AUTHENTICATION_TYPE: DatabaseGET /api/v1/superuser/users/ 端点才会返回用户和超级用户。它不适用于 LDAP 身份验证类型。

    Copy to Clipboard Toggle word wrap
    $ 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 and Memberships 页面上的 Collaborators 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/ 端点创建新机构:

    Copy to Clipboard Toggle word wrap
    $ 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/"

    输出示例

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

    Copy to Clipboard Toggle word wrap
    $ 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>"
          }'

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 页面中,有一个 Search input box。有了此框,用户可以搜索特定的组织,以确保它们被正确地安排删除。例如,如果用户正在删除 10 个机构,并且希望确保删除了一个特定的机构,他们可以使用 搜索 输入框确认机构标记为删除。

  4. 通过在框中键入 确认,确认您要永久删除该机构。
  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} 端点删除机构:

    Copy to Clipboard Toggle word wrap
    $ 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} 命令来查看是否返回已删除机构的详情:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 中创建软件仓库的方法有多种。以下选项取决于您的用例:

  • 您可以使用相关的 podmandocker 命令来推送镜像。
  • 您可以使用 Red Hat Quay UI。
  • 您可以使用 Red Hat Quay API。
  • 例如,对于 OCI 工件(一个大型语言模型(LLM)或机器学习应用程序),您可以使用 skopeo 或 as 将工件复制到您的存储库中。

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

    现在,您的 example 存储库应该在 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 中拉取示例页面。例如:

    Copy to Clipboard Toggle word wrap
    $ sudo podman pull busybox

    输出示例

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

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

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

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

    输出示例

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

5.3. 使用 Skopeo 创建软件仓库

在某些情况下,podman CLI 工具无法拉取某些工件类型,如 application/x-mlmodel 或其他 AI/ML 工件。尝试将 podman pull 与这个工件类型搭配使用会导致以下错误:

Copy to Clipboard Toggle word wrap
Error: parsing image configuration: unsupported image-specific operation on artifact with type "application/x-mlmodel"

另外,您可以使用 skopeo copy 将工件从一个位置复制到 Red Hat Quay 存储库。

先决条件

  • 已安装 skopeo CLI。
  • 您已登录到源 registry (本例中为 \registry.redhat.io),并具有有效的身份验证文件(~/.docker/config.json)。另外,在使用 skopeo CLI 运行命令时,您可以使用 -- src-username 和--src-password 参数提供凭证。
  • 已登陆到 Red Hat Quay 存储库。
  • 根据 AI/ML 工件的大小,您可能需要准备 registry 以接受大型工件

步骤

  • 在工件上使用 skopeo copy 命令将工件复制到 Red Hat Quay 存储库。例如:

    Copy to Clipboard Toggle word wrap
    $ sudo skopeo copy --dest-tls-verify=false --all \ 
    1
     
    2
    
      --src-username <source_username> --src-password <source_password> \ 
    3
    
      --src-authfile ~/.docker/config.json \ 
    4
    
      --dest-username <username> --dest-password <password> \ 
    5
    
      docker://registry.redhat.io/rhelai1/granite-8b-code-instruct:1.4-1739210683 \ 
    6
    
      docker://quay-server.example.com/<namespace>/granite-8b-code-instruct:latest 
    7
    1
    可选。--dest-tls-verify=false 为目标 registry 禁用 SSL/TLS 验证。
    2
    可选。--all 标志可以选择复制所有镜像清单,包括多架构镜像。
    3
    可选。如果没有登录到 registry,您可以使用这些参数传递源 registry 凭证。
    4
    可选。Docker 身份验证文件的路径。通常位于 ~/.docker/config.json
    5
    您的 Red Hat Quay registry 用户名和密码。
    6
    来自红帽容器 registry 的源镜像或工件。确保您已登录到 registry,并可拉取镜像。
    7
    附加命名空间和镜像名称的 Red Hat Quay 存储库的 URL。

    输出示例

    Copy to Clipboard Toggle word wrap
    Getting image source signatures
    Checking if image destination supports signatures
    Copying blob 9538fa2b8ad9 done   |
    Copying blob 491ae95f59a2 done   |
    Copying blob 01196d075d77 done   |
    Copying blob e53a4633c992 done   |
    Copying blob c266e9cfa731 done   |
    Copying blob dae0e701d9b2 done   |
    Copying blob 1e227a2c78d8 done   |
    Copying blob 94ff9338861b done   |
    Copying blob 2f2bba45146f done   |
    Copying blob d3b4df07a0ce done   |
    Copying blob f533a8dbb852 done   |
    Copying config 44136fa355 done   |
    Writing manifest to image destination
    Storing signatures

后续步骤

5.4. 使用 API 创建存储库

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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"

    输出示例

    Copy to Clipboard Toggle word wrap
    {"namespace": "quayadmin", "name": "<new_repository_name>", "kind": "image"}

5.5. 使用 UI 删除存储库

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

先决条件

  • 您已创建了软件仓库。

步骤

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

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

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

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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} 命令来查看是否返回已删除存储库的详情:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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、Masos 等,以访问每个定义的存储库。

每个 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 permission
  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} 端点为机构创建新的机器人帐户:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 端点:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 accounts
  4. 对于将添加到多个软件仓库中的机器人帐户,点 kebab 图标 → Set repository 权限
  5. Set repository permissions 页面上,选中机器人帐户要添加到的存储库的框。例如:

    Set repository permissions

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

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

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

重要

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

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    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)中,输入以下命令尝试作为机器人帐户登录:

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

    返回以下出错信息:

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

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

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 端点为机构重新生成机器人令牌:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 端点为当前用户重新生成机器人令牌:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 端点删除机构的机器人帐户:

    Copy to Clipboard Toggle word wrap
    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 命令,以查看是否为机器人帐户返回详情:

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

    输出示例

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

    Copy to Clipboard Toggle word wrap
    $ 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} 命令,以查看是否为机器人帐户返回详情:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"message":"Could not find robot with specified username"}

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

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

使用 Red Hat Quay 3.14 时,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 端点。例如:

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

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

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

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

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

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

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

    Copy to Clipboard Toggle word wrap
    $ 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 返回的代码。

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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

    Copy to Clipboard Toggle word wrap
    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。例如:

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

    Copy to Clipboard Toggle word wrap
    $ python3 robot_fed_token_auth.py

    输出示例

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

    重要

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

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

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

6.8.4. 推送和拉取镜像

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

先决条件

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

步骤

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

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

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

    输出示例

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

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

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

    输出示例

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

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

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

7.1.2. 使用 API 创建团队

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

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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>

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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。团队成员对存储库没有权限。
      • 读取.团队成员可以从存储库查看和拉取。
      • 写入。团队成员可以从中读取(拉取)并写入(推送)到存储库。
      • 管理.从存储库拉取(pull)和推送到存储库的完整访问权限以及执行与存储库关联的管理任务的能力。
    • 删除。此弹出窗口允许您单击 Delete 来删除团队。
7.1.3.2.2. 查看团队的附加信息

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

步骤

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

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

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} 命令,将成员添加到现有团队中:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令删除团队的成员:

    Copy to Clipboard Toggle word wrap
    $ 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 命令,并确保输出中不会返回成员。

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令以通过电子邮件地址向现有团队邀请用户:

    Copy to Clipboard Toggle word wrap
    $ 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} 命令来删除电子邮件地址邀请来加入团队。例如:

    Copy to Clipboard Toggle word wrap
    $ 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 命令,为机构的团队返回存储库权限列表。请注意,您的团队必须已添加到存储库中才能返回信息。

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

    输出示例

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

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

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

    输出示例

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

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

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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。此时会出现 toggle drawer。
  4. 选择 AnyoneSpecific 用户,以在创建存储库时创建默认权限。

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

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

      • 存储库创建者.提供用户或机器人帐户。
      • 应用到。提供用户名、机器人帐户或团队名称。
      • 权限.将权限设置为 ReadWriteAdmin 之一。
  5. Create default permission。此时会出现确认框,返回以下警报: 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 端点创建默认权限:

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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。

    Copy to Clipboard Toggle word wrap
    $ 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>

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令删除权限:

    Copy to Clipboard Toggle word wrap
    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 命令来获取所有权限的列表:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令更改用户权限:

    Copy to Clipboard Toggle word wrap
    $ 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>

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令:

    Copy to Clipboard Toggle word wrap
    $ 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/ 命令来检查权限是否已删除:

    Copy to Clipboard Toggle word wrap
    $ 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>/

    输出示例

    Copy to Clipboard Toggle word wrap
    {"message":"User does not have permission for repo."}

第 8 章 镜像标签概述

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

镜像标签具有以下优点:

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

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

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

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

先决条件

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

步骤

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

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

8.1.1. 使用 UI 查看模型卡信息

可以在 v2 UI 中查看模型卡信息。模型卡基本上是标记(.md)文件,以及其他元数据来提供有关计算机学习应用程序的信息。要查看模型卡信息,清单必须具有 config.yaml 文件中定义的注解(如 application/x-mlmodel),并包括一个存储为清单中的层的模型卡。当满足这些条件时,Model Card 选项卡会出现在标签的 Details 页面中。

先决条件

  • 您已推送了该注解类型的工件,它包括模型卡(.md)文件。

步骤

  1. 更新 config.yaml 文件,使其包含以下信息:

    模型卡 YAML 示例

    Copy to Clipboard Toggle word wrap
    FEATURE_UI_MODELCARD: true 
    1
    
    UI_MODELCARD_ARTIFACT_TYPE: application/x-mlmodel 
    2
    
    UI_MODELCARD_ANNOTATION: 
    3
    
      org.opencontainers.image.description: "Model card metadata"
    UI_MODELCARD_LAYER_ANNOTATION: 
    4
    
      org.opencontainers.image.title: README.md

    1
    在 UI 中启用 Model Card image 选项卡。
    2
    定义模型卡工件类型。在本例中,工件类型是 application/x-mlmodel
    3
    可选。如果镜像没有定义 artifactType,则会在清单级别检查此字段。如果找到匹配的注解,系统会搜索带有注解与 UI_MODELCARD_LAYER_ANNOTATION 匹配的层。
    4
    可选。如果镜像定义了 artifactType 和多个层,则使用此字段定位包含模型卡的特定层。
  2. 将该注解类型的工件以及包含模型卡(.md)文件的工件推送到您的存储库。
  3. 在 v2 UI 上,单击 Repositories
  4. 点存储库的名称。
  5. 点标签的名称。您会进入该标签的 Details 页面。
  6. ModelCard 查看有关镜像的信息。例如:

    Modelcard 信息

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

使用 API 查看镜像标签信息

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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/ 端点。例如:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令更改标签指向或创建新标签:

    Copy to Clipboard Toggle word wrap
    $ 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>

    输出示例

    Copy to Clipboard Toggle word wrap
    "Updated"

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

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {}

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

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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, must be key value by =.

  6. 单击框的空格以添加标签。
  7. 可选。添加第二个标签。
  8. Save labels 将标签保存到镜像标签。返回以下通知: 成功创建标签
  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} 命令检索存储库中特定清单的详细信息:

    Copy to Clipboard Toggle word wrap
    $ 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 命令检索特定清单的标签列表:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令获取有关特定清单的信息:

    Copy to Clipboard Toggle word wrap
    $ 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>

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 命令在给定存储库中向清单添加额外标签。例如:

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令删除标签:

    Copy to Clipboard Toggle word wrap
    $ 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= 标签。这会将一个时间设置为在构建镜像时过期。该标签仅适用于镜像清单。
  • 在创建镜像时,通过在 Dockerfile 中设置 quay.expires-after= 注解标签。可以为镜像清单和镜像索引传递 --annotation
  • 通过在 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。例如:

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

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

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

  • 1h
  • 2d
  • 3w

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

注意

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

先决条件

步骤

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

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

    输出示例

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

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

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

    输出示例

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

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

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

先决条件

步骤

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

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

    输出示例

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

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

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

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

8.7.5. 使用 API 设置标签过期

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ curl -X PUT \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "expiration": "<seconds since epoch>"
      }' \
      https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/<tag>

    输出示例

    Copy to Clipboard Toggle word wrap
    "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)。例如:

    Copy to Clipboard Toggle word wrap
    $ 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 > :过滤标签,使其只包含具有指定名称的标签。

      Copy to Clipboard Toggle word wrap
      $ 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"

      输出示例

      Copy to Clipboard Toggle word wrap
      {"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 > 查询,您可以过滤特定标签的结果。例如:

    Copy to Clipboard Toggle word wrap
    $ 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"

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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} 命令删除镜像标签:

    Copy to Clipboard Toggle word wrap
    $ 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/ 命令。例如:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 命令将存储库标签恢复到以前的镜像。例如:

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {}

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

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

    输出示例

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

可以通过多种方法访问日志文件:

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

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

注意

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

9.1. 查看使用日志

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

步骤

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

    Logs page

  4. 可选。通过向 FromTo box 添加日期来设置查看日志条目的日期范围。
  5. 可选。单击导出,以导出日志。您必须输入一个电子邮件地址或以 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 端点为当前用户返回聚合(或分组)日志:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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 查询,以便在特定时间段内获取特定用户的聚合日志。例如:

    Copy to Clipboard Toggle word wrap
    $ 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 来查看聚合的日志。例如:

    Copy to Clipboard Toggle word wrap
    $ 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 字段:

    Copy to Clipboard Toggle word wrap
    $ 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 端点返回用户的日志条目列表。例如:

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

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

    Copy to Clipboard Toggle word wrap
    $ 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"

    输出示例

    Copy to Clipboard Toggle word wrap
    ---
    {"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 端点返回指定机构的日志:

    Copy to Clipboard Toggle word wrap
    $ 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 端点返回指定存储库的日志:

    Copy to Clipboard Toggle word wrap
    $ 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 box 中输入范围。
  4. Export Logs 按钮。此时会出现 Export Usage Logs 弹出窗口,如下所示

    Enter email or callback URL to receive exported logs

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

    • 收到一封电子邮件,提醒您所请求的导出日志条目的可用警报。
    • 返回来自 webhook URL 的日志导出请求的成功状态。此外,您也提供了一个到导出数据的链接,供您删除以下载日志。
注意

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

9.4. 使用 API 导出日志

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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"

    输出示例

    Copy to Clipboard Toggle word wrap
    {"export_id": "6a0b9ea9-444c-4a19-9db8-113201c38cd4"}

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

    Copy to Clipboard Toggle word wrap
    $ 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 端点导出存储库的日志:

    Copy to Clipboard Toggle word wrap
    $ 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. 要显示有关多架构镜像的更多信息,请点 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. 要显示有关多架构镜像的更多信息,请点 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 端点来检索有关存储库中特定清单的安全信息。例如:

    Copy to Clipboard Toggle word wrap
    $ 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>"

    输出示例

    Copy to Clipboard Toggle word wrap
    {"status": "queued", "data": null}

第 11 章 通知概述

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

11.1. 通知操作

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

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

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

电子邮件通知

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

Webhook POST 通知

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

当 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 and Notifications 类别中,点 Create Notification 为存储库事件添加新通知。此时会出现 Create notification 弹出框。
  4. Create repository 弹出窗口中,点 When this event occurs select a event。您可以为以下类型的事件选择通知:

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

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

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

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

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 小时,但可调整为保证。

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

验证

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

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

    Copy to Clipboard Toggle word wrap
    {
      "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 命令在存储库上创建通知:

    Copy to Clipboard Toggle word wrap
    $ 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} 命令来获取有关存储库通知的信息:

    Copy to Clipboard Toggle word wrap
    {"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 命令来测试存储库通知:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    {}

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

    Copy to Clipboard Toggle word wrap
    $ 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} 命令来删除存储库通知:

    Copy to Clipboard Toggle word wrap
    $ 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/ 命令来检索所有通知的列表:

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

    输出示例

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

11.4. 仓库事件描述

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

Repository Push

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

Copy to Clipboard Toggle word wrap
{
  "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 构建中的响应,它已放入构建系统中。

注意

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

Copy to Clipboard Toggle word wrap
{
  "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 构建中的响应,它已放入构建系统中。

注意

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

Copy to Clipboard Toggle word wrap
{
  "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 事件同时发生。

Copy to Clipboard Toggle word wrap
{
  "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 构建的响应。

Copy to Clipboard Toggle word wrap
{
  "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 构建的响应。

Copy to Clipboard Toggle word wrap
{
  "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 构建的响应已在存储库中检测到漏洞。

Copy to Clipboard Toggle word wrap
{
  "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 章 Red Hat Quay 配额管理和强制概述

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

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

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

12.1. 配额管理架构

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

重要

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

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

注意

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

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

  • QuotaRepositorySize
  • QuotaNameSpaceSize
  • QuotaRegistrySize

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

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

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

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

12.2. 配额管理限制

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

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

表 12.1. worker 计算环境变量
变量Description

Postgres

8388608 TB

MySQL

8388608 TB

SQL Server

16777216 TB

12.3. 配额管理配置字段

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

FEATURE_QUOTA_MANAGEMENT

布尔值

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

Copy to Clipboard Toggle word wrap
**Default:** `False`

DEFAULT_SYSTEM_REJECT_QUOTA_BYTES

字符串

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

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

QUOTA_BACKFILL

布尔值

启用配额回填 worker 来计算预先存在的 Blob 的大小。

默认True

QUOTA_TOTAL_DELAY_SECONDS

字符串

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

默认1800

PERMANENTLY_DELETE_TAGS

布尔值

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

默认False

RESET_CHILD_MANIFEST_EXPIRATION

布尔值

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

默认False

12.3.1. 配额管理配置示例

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

配额管理 YAML 配置

Copy to Clipboard Toggle word wrap
FEATURE_QUOTA_MANAGEMENT: true
FEATURE_GARBAGE_COLLECTION: true
PERMANENTLY_DELETE_TAGS: true
QUOTA_TOTAL_DELAY_SECONDS: 1800
RESET_CHILD_MANIFEST_EXPIRATION: true

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

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

先决条件

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

步骤

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

    Copy to Clipboard Toggle word wrap
    $ 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"
         }'

    输出示例

    Copy to Clipboard Toggle word wrap
    "Created"

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

    Copy to Clipboard Toggle word wrap
    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://<quay-server.example.com>/api/v1/organization/<organization_name>/quota  | jq

    输出示例

    Copy to Clipboard Toggle word wrap
    [{"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} 命令修改现有的配额限制。例如:

    Copy to Clipboard Toggle word wrap
    $ 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>
         }'

    输出示例

    Copy to Clipboard Toggle word wrap
    {"id": 1, "limit_bytes": 21474836480, "limit": "20.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}

12.4.1. 推送镜像

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

12.4.1.1. 推送 ubuntu:18.04

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

示例命令

Copy to Clipboard Toggle word wrap
$ 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

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

要查看消耗的存储,针对 /api/v1/repository 端点使用 GET 数据:

示例命令

Copy to Clipboard Toggle word wrap
$ 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

输出示例

Copy to Clipboard Toggle word wrap
{
  "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
    }
  ]
}

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

    示例命令

    Copy to Clipboard Toggle word wrap
    $ 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 端点:

    示例命令

    Copy to Clipboard Toggle word wrap
    $ 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'

    输出示例

    Copy to Clipboard Toggle word wrap
    {
      "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} 端点:

    示例命令

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    {
      "name": "testorg",
      ...
      "quotas": [
        {
          "id": 1,
          "limit_bytes": 104857600,
          "limits": []
        }
      ],
      "quota_report": {
        "quota_bytes": 87190725,
        "configured_quota": 104857600
      }
    }

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

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

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

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

reject limit 命令示例

Copy to Clipboard Toggle word wrap
$ 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

警告限制命令示例

Copy to Clipboard Toggle word wrap
$ 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

12.4.2.2. 查看拒绝和警告限制

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

查看配额限制

Copy to Clipboard Toggle word wrap
$  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

配额限制的输出示例

Copy to Clipboard Toggle word wrap
[
  {
    "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
  }
]

12.4.2.3. 超过拒绝限制时推送镜像

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

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

镜像推送示例

Copy to Clipboard Toggle word wrap
$ 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

配额超过输出示例

Copy to Clipboard Toggle word wrap
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

12.4.2.4. 超过限制的通知

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

配额通知

Quota notifications

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

随着容器开发的流行度不断增长,客户越来越依赖于 Docker 或 Google Cloud Platform 等上游 registry 中的容器镜像来获取服务。现在,registry 对用户可以从这些 registry 中拉取的次数有速率限制和节流。

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

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

  • 特定的组织可以定义为上游 registry 的缓存。
  • 配置作为特定上游 registry 的缓存的 Quay 组织。此存储库可以使用 Quay UI 定义,并提供以下配置:

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

13.1. 代理缓存架构

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

Proxy cache overview

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

Pulled image overview

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

Updating opposing layers overview

如果上游镜像和缓存的版本相同,则不会拉取层,并且缓存的镜像会传送到用户。

在某些情况下,用户在上游 registry 停机时启动拉取(pull)。如果发生这种情况在配置的 staleness 周期中,则会提供存储在缓存中的镜像。如果在配置的 staleness 周期后拉取发生,则错误会传播到用户。下图描述了在配置的过时后发生拉取(pull)架构概述:

Staleness pull overview

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

13.2. 代理缓存限制

Red Hat Quay 的代理缓存有以下限制:

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

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

    注意

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

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

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

验证

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

    Copy to Clipboard Toggle word wrap
    $ podman pull <registry_url>/<organization_name>/<quayio_namespace>/<image_name>
    重要

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

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

在 Red Hat Quay 3.8 中,代理缓存功能已被改进,它带有用于标记镜像的自动运行功能。只有在代理命名空间配置了配额限制时,才会使用镜像标签的自动修剪。目前,如果镜像大小大于机构的配额,则会跳过镜像,直到管理员创建所需的空间为止。现在,当镜像推送超过分配空间时,自动运行增强会标记最早使用的标签被删除。因此,新的镜像标签会被存储,但最少使用的镜像标签被标记为删除。

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

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

先决条件

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

流程

  1. 从代理机构拉取镜像到存储库,例如:

    Copy to Clipboard Toggle word wrap
    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.7.9
  2. 根据存储库空间,您可能需要从代理机构中拉取其他镜像,例如:

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

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

    Copy to Clipboard Toggle word wrap
    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.5.1
  5. 刷新 Red Hat Quay registry 的 Tags 页面。您推送的第一个镜像(如 quay:3.7.9 )应该已自动修剪。标签 页面现在应当显示 quay:3.6.2quay:3.5.1

第 14 章 开放容器计划支持

容器注册表最初设计为支持 Docker 镜像格式中的容器镜像。为了促进 Docker 之外的其他运行时,还创建了开放容器项目(OCI),以提供与容器运行时和镜像格式相关的标准化。大多数容器注册表支持 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 介质类型的示例。

14.1. Helm 和 OCI 的先决条件

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

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

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

14.1.1. 使您的系统能够信任 Red Hat Quay 使用的 SSL/TLS 证书

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

步骤

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

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

    Copy to Clipboard Toggle word wrap
    $ sudo update-ca-trust extract

14.2. 使用 Helm chart

使用以下示例,从红帽社区实践(CoP)存储库下载并推送 etherpad chart。

先决条件

  • 已登陆到 Red Hat Quay。

步骤

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

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

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

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

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

    输出示例

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

    Copy to Clipboard Toggle word wrap
    $ helm registry login quay370.apps.quayperf370.perfscale.devcluster.openshift.com
  6. 使用 helm push 命令将 chart 推送到存储库:

    Copy to Clipboard Toggle word wrap
    $ helm push etherpad-0.0.4.tgz oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com

    输出示例:

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

    Copy to Clipboard Toggle word wrap
    $ rm -rf etherpad-0.0.4.tgz
    Copy to Clipboard Toggle word wrap
    $ helm pull oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad --version 0.0.4

    输出示例:

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

14.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 介质类型添加注解。例如:

    Copy to Clipboard Toggle word wrap
    $ 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 标签。

    输出示例

    Copy to Clipboard Toggle word wrap
    ✓ 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 拉取镜像。例如:

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

    Copy to Clipboard Toggle word wrap
    $ oras manifest fetch quay.io/<organization_name>/<repository>/<image_name>:<tag>

    输出示例

    Copy to Clipboard Toggle word wrap
    {"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"}}

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

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

先决条件

步骤

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

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

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

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    -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 引用器 标签 模式附加清单:

    Copy to Clipboard Toggle word wrap
    $ 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

    输出示例

    Copy to Clipboard Toggle word wrap
    ✓ 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. 输入以下命令 使用标签 模式发现工件的引用器:

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

    输出示例

    Copy to Clipboard Toggle word wrap
    quay.io/testorg3/myartifact-image@sha256:db440c57edfad40c682f9186ab1c1075707ce7a6fdda24a89cb8c10eaad424da
    └── doc/example
        └── sha256:2d4b54201c8b134711ab051389f5ba24c75c2e6b0f0ff157fce8ffdfe104f383

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

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

    输出示例

    Copy to Clipboard Toggle word wrap
    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 字段。例如:

      Copy to Clipboard Toggle word wrap
      # ...
      FEATURE_REFERRERS_API: true
      # ...
    2. 输入以下命令对凭证进行 Base64 编码:

      Copy to Clipboard Toggle word wrap
      $ echo -n '<username>:<password>' | base64

      输出示例

      Copy to Clipboard Toggle word wrap
      abcdeWFkbWluOjE5ODlraWROZXQxIQ==

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

      Copy to Clipboard Toggle word wrap
      $ 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

      输出示例

      Copy to Clipboard Toggle word wrap
      {
        "token": "<example_token_output>..."
      }

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

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

    输出示例

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

關於紅帽

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

Theme

© 2025 Red Hat, Inc.