标签不可变性规则

默认情况下,用户可以重复推送具有相同标签的制品到 Harbor 中的仓库。这会导致标签在制品之间迁移,并且每个被移除标签的制品都会变成无标签的。这是由于上游 Distribution/Distribution 不强制执行镜像标签和镜像摘要之间的映射关系。在某些情况下,这可能是不可取的,因为标签不再被信任来标识镜像版本。sha256 摘要仍然是可靠的,并且始终指向相同的构建,但是它不是人类可读的格式。

为了防止这种情况,Harbor 允许你在项目级别配置标签不可变性,以便当制品的标签与现有标签匹配时,具有某些标签的制品无法推送到 Harbor。这可以防止现有制品被覆盖。标签不可变性保证了不可变的已标记制品不能被删除,也不能以任何方式更改,例如通过重新推送、重新标记或从另一个目标仓库复制。

不可变性规则使用 OR 逻辑,因此,如果你设置了多个规则,并且标签与其中任何一个规则匹配,则该标签将被标记为不可变。

不可变标签如何防止标签删除

自 v2.0 起,你可以删除制品的任何标签,而无需删除制品本身。因此,你可以通过配置与特定标签匹配的不可变性规则来锁定该标签,这意味着持有该标签的制品也不能被覆盖或删除。但是,你仍然可以删除与此不可变制品关联的其他标签。考虑以下示例

  1. 在 Docker 客户端中,将 hello-world:v1 推送到一个项目。
  2. 在该项目中,设置一个不可变标签规则,在该项目中匹配镜像和标签 hello-world:v1
  3. hello-world:v1 推送到项目。
  4. 在你的本地环境中,将 hello-world:v1 重新标记为 hello-world:v2
  5. hello-world:v2 推送到项目。
  6. 在 Harbor 界面中,尝试依次删除 hello-world 的标签 v1v2

在这种情况下,你无法删除标签 v1,因为它是一个不可变标签,并且你无法删除持有此标签的制品 hello-world。但是你可以删除标签 v2,即使它与 v1 共享相同的 sha256 摘要。

创建标签不可变性规则

  1. 使用至少具有项目管理员权限的帐户登录到 Harbor 界面。

  2. 转到 项目,选择一个项目,选择策略,然后选择 标签不可变性

    Add an immutability rule

  3. 点击 添加规则

    • 仓库 行中,输入一个逗号分隔的仓库列表,通过从下拉菜单中选择 匹配排除 来决定将规则应用于这些仓库还是从规则中排除这些仓库。

    • 标签 行中,输入一个逗号分隔的标签列表,通过从下拉菜单中选择 匹配排除 来决定将规则应用于这些标签还是从规则中排除这些标签。

      Add an immutability rule

  4. 点击 添加 以保存规则。

    每个项目最多可以添加 15 个不可变性规则。

    添加规则后,在“仓库”选项卡中,任何被规则标识的标签都会被标记为 不可变

  5. 要修改现有规则,请使用规则旁边的 操作 下拉菜单来停用、编辑或删除该规则。

    Immutability rules

示例

要使项目中所有仓库的所有标签都不可变,请设置以下选项

  • 对于仓库 设置为 匹配 并输入 **
  • 标签 设置为 匹配 并输入 **

要允许覆盖标签 rctestnightly,但使所有其他标签不可变,请设置以下选项

  • 对于仓库 设置为 匹配 并输入 **
  • 标签 设置为 排除 并输入 rc,test,nightly