如何在 Sonatype Nexus3 中通过 docker 标签限制内容选择器?

How to limit content selector by docker tag in Sonatype Nexus3?

如何在 Sonatype Nexus3 中只授予对特定标签和指定命名空间的访问权限?

例如,我们将使用名称为:docker.domain.com/namespace/image:1.1.1

的图像

我们只想允许用户拉取标签与我们的 Semver 正则表达式相匹配的图像。 (您可以根据自己的需要简单地调整正则表达式)

内容选择器

format == 'docker'  
&& (
    path == '/v2/' 
    || (
        path =~ '.*/namespace/.*' 
        && (
            path =~ '.*[0-9]+\.[0-9]+\.[0-9]+'
            || path =~ '.*/blobs/.*'
            )
        )
    )

说明

  • && AND 运算符
  • || 或运算符
  • == EQUAL 运算符
  • =~ 正则表达式运算符
  • format == 'docker'设置应该选择的格式类型
  • path == '/v2/' 按照说明授予登录和清单权限 docker v2 API specification
  • path=~'.*/blobs/.*' 授予对图像层的拉取权限
  • path=~'.*[0-9]+\.[0-9]+\.[0-9]+' Semver-regex

最重要的部分是命名空间和Semver-regex、命名空间和blob路径的结合。

编辑: 请参阅 rseddons answer 以获得更深入的解释。

Docker 图片在 Nexus 中是这样存储的:

blob 是 docker 层,它们可以(而且经常)在多个 docker 图像之间共享。这种层共享是 docker 是存储 VM 的有效格式的原因。但这也意味着你不能限制对层的访问,你只能限制对清单和标签的访问。因此,您需要创建允许访问所有图层的内容选择器权限。

此外,您需要允许访问 /v2/ 以进行 docker 登录,并允许访问 /v1/search 以进行搜索。

所以您需要像这样的内容选择器权限,允许访问每个人都需要的东西:

path =~ "/v2/|/v2/blobs/.*|/v2/search/.*"

在此之后,您可以使用如下内容选择器有选择地允许访问清单和标签:

path =^ "/v2/some-docker-image/"

path =^ "/v2/library/ubuntu/"