浏览代码

distribution: use correct platform matcher for containerd

This uses the correct comparison with compatibility
checks for variants.

The deprecated arm variant matcher is left as is.
Although it is not needed for valid cases it is not
fully compatible as also matches some invalid
combinations, so should be removed separately.

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Tonis Tiigi 3 年之前
父节点
当前提交
fcc42d5682
共有 1 个文件被更改,包括 6 次插入1 次删除
  1. 6 1
      distribution/pull_v2_unix.go

+ 6 - 1
distribution/pull_v2_unix.go

@@ -5,6 +5,7 @@ package distribution // import "github.com/docker/docker/distribution"
 
 
 import (
 import (
 	"context"
 	"context"
+	"sort"
 
 
 	"github.com/containerd/containerd/platforms"
 	"github.com/containerd/containerd/platforms"
 	"github.com/docker/distribution"
 	"github.com/docker/distribution"
@@ -20,7 +21,7 @@ func (ld *v2LayerDescriptor) open(ctx context.Context) (distribution.ReadSeekClo
 
 
 func filterManifests(manifests []manifestlist.ManifestDescriptor, p specs.Platform) []manifestlist.ManifestDescriptor {
 func filterManifests(manifests []manifestlist.ManifestDescriptor, p specs.Platform) []manifestlist.ManifestDescriptor {
 	p = platforms.Normalize(withDefault(p))
 	p = platforms.Normalize(withDefault(p))
-	m := platforms.NewMatcher(p)
+	m := platforms.Only(p)
 	var matches []manifestlist.ManifestDescriptor
 	var matches []manifestlist.ManifestDescriptor
 	for _, desc := range manifests {
 	for _, desc := range manifests {
 		if m.Match(toOCIPlatform(desc.Platform)) {
 		if m.Match(toOCIPlatform(desc.Platform)) {
@@ -29,6 +30,10 @@ func filterManifests(manifests []manifestlist.ManifestDescriptor, p specs.Platfo
 		}
 		}
 	}
 	}
 
 
+	sort.SliceStable(matches, func(i, j int) bool {
+		return m.Less(toOCIPlatform(matches[i].Platform), toOCIPlatform(matches[j].Platform))
+	})
+
 	// deprecated: backwards compatibility with older versions that didn't compare variant
 	// deprecated: backwards compatibility with older versions that didn't compare variant
 	if len(matches) == 0 && p.Architecture == "arm" {
 	if len(matches) == 0 && p.Architecture == "arm" {
 		p = platforms.Normalize(p)
 		p = platforms.Normalize(p)