package ociimg import ( "context" "fmt" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/types" ) func imageFromIndex(index v1.ImageIndex, platform *v1.Platform) (v1.Image, v1.Descriptor, error) { im, err := index.IndexManifest() if err != nil { return nil, v1.Descriptor{}, err } for i := range im.Manifests { manifest := im.Manifests[i] if manifest.MediaType != types.OCIManifestSchema1 && im.MediaType != types.DockerManifestSchema2 { return nil, v1.Descriptor{}, fmt.Errorf("%q has unexpected mediaType %q in base for %q", manifest.Digest, manifest.MediaType, platform) } if manifest.Platform.Satisfies(*platform) { img, err := index.Image(manifest.Digest) return img, manifest, err } } return nil, v1.Descriptor{}, fmt.Errorf("index does not contain image satisfying the requested platoform %q", platform) } func fetch(ctx context.Context, ref name.Reference) (imageOrIndex, error) { ropt := []remote.Option{ remote.WithUserAgent(userAgent), remote.WithContext(ctx), } desc, err := remote.Get(ref, ropt...) if err != nil { return nil, err } if desc.MediaType.IsIndex() { return desc.ImageIndex() } return desc.Image() }