X Tutup
Skip to content

Commit eef47ff

Browse files
committed
Add platform filtering on children handler
Fixes pulling of multi-arch images by limiting the expansion of the index by filtering to the current default platform. Signed-off-by: Derek McGowan <derek@mcgstyle.net>
1 parent 9934acb commit eef47ff

File tree

6 files changed

+27
-10
lines changed

6 files changed

+27
-10
lines changed

client.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/containerd/containerd/content"
2424
"github.com/containerd/containerd/errdefs"
2525
"github.com/containerd/containerd/images"
26+
"github.com/containerd/containerd/platforms"
2627
"github.com/containerd/containerd/plugin"
2728
"github.com/containerd/containerd/reference"
2829
"github.com/containerd/containerd/remotes"
@@ -226,7 +227,7 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpts) (Imag
226227
} else {
227228
handler = images.Handlers(append(pullCtx.BaseHandlers,
228229
remotes.FetchHandler(store, fetcher),
229-
images.ChildrenHandler(store))...,
230+
images.ChildrenHandler(store, platforms.Default()))...,
230231
)
231232
}
232233

@@ -307,7 +308,7 @@ func (c *Client) Push(ctx context.Context, ref string, desc ocispec.Descriptor,
307308
pushHandler := remotes.PushHandler(cs, pusher)
308309

309310
handlers := append(pushCtx.BaseHandlers,
310-
images.ChildrenHandler(cs),
311+
images.ChildrenHandler(cs, platforms.Default()),
311312
filterHandler,
312313
pushHandler,
313314
)

cmd/ctr/images.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ var imagesListCommand = cli.Command{
5858
tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0)
5959
fmt.Fprintln(tw, "REF\tTYPE\tDIGEST\tSIZE\tPLATFORM\tLABELS\t")
6060
for _, image := range imageList {
61-
size, err := image.Size(ctx, cs)
61+
size, err := image.Size(ctx, cs, platforms.Default())
6262
if err != nil {
6363
log.G(ctx).WithError(err).Errorf("failed calculating size for image %s", image.Name)
6464
}

export.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/containerd/containerd/content"
1111
"github.com/containerd/containerd/images"
12+
"github.com/containerd/containerd/platforms"
1213
ocispecs "github.com/opencontainers/image-spec/specs-go"
1314
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
1415
"github.com/pkg/errors"
@@ -32,7 +33,7 @@ func (c *Client) exportToOCITar(ctx context.Context, desc ocispec.Descriptor, wr
3233
}
3334

3435
handlers := images.Handlers(
35-
images.ChildrenHandler(cs),
36+
images.ChildrenHandler(cs, platforms.Default()),
3637
images.HandlerFunc(exportHandler),
3738
)
3839

image.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (i *image) RootFS(ctx context.Context) ([]digest.Digest, error) {
5050

5151
func (i *image) Size(ctx context.Context) (int64, error) {
5252
provider := i.client.ContentStore()
53-
return i.i.Size(ctx, provider)
53+
return i.i.Size(ctx, provider, platforms.Default())
5454
}
5555

5656
func (i *image) Config(ctx context.Context) (ocispec.Descriptor, error) {

images/handlers.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/containerd/containerd/content"
99
"github.com/containerd/containerd/log"
10+
"github.com/containerd/containerd/platforms"
1011
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
1112
"github.com/pkg/errors"
1213
"golang.org/x/sync/errgroup"
@@ -127,7 +128,7 @@ func Dispatch(ctx context.Context, handler Handler, descs ...ocispec.Descriptor)
127128
//
128129
// One can also replace this with another implementation to allow descending of
129130
// arbitrary types.
130-
func ChildrenHandler(provider content.Provider) HandlerFunc {
131+
func ChildrenHandler(provider content.Provider, platform string) HandlerFunc {
131132
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
132133
var descs []ocispec.Descriptor
133134
switch desc.MediaType {
@@ -157,7 +158,21 @@ func ChildrenHandler(provider content.Provider) HandlerFunc {
157158
return nil, err
158159
}
159160

160-
descs = append(descs, index.Manifests...)
161+
if platform != "" {
162+
matcher, err := platforms.Parse(platform)
163+
if err != nil {
164+
return nil, err
165+
}
166+
167+
for _, d := range index.Manifests {
168+
if d.Platform == nil || matcher.Match(*d.Platform) {
169+
descs = append(descs, d)
170+
}
171+
}
172+
} else {
173+
descs = append(descs, index.Manifests...)
174+
}
175+
161176
case MediaTypeDockerSchema2Layer, MediaTypeDockerSchema2LayerGzip,
162177
MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig,
163178
ocispec.MediaTypeImageLayer, ocispec.MediaTypeImageLayerGzip:

images/image.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ func (image *Image) RootFS(ctx context.Context, provider content.Provider, platf
5858
}
5959

6060
// Size returns the total size of an image's packed resources.
61-
func (image *Image) Size(ctx context.Context, provider content.Provider) (int64, error) {
61+
func (image *Image) Size(ctx context.Context, provider content.Provider, platform string) (int64, error) {
6262
var size int64
6363
return size, Walk(ctx, Handlers(HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
6464
if desc.Size < 0 {
6565
return nil, errors.Errorf("invalid size %v in %v (%v)", desc.Size, desc.Digest, desc.MediaType)
6666
}
6767
size += desc.Size
6868
return nil, nil
69-
}), ChildrenHandler(provider)), image.Target)
69+
}), ChildrenHandler(provider, platform)), image.Target)
7070
}
7171

7272
func Manifest(ctx context.Context, provider content.Provider, image ocispec.Descriptor, platform string) (ocispec.Manifest, error) {
@@ -196,7 +196,7 @@ func Platforms(ctx context.Context, provider content.Provider, image ocispec.Des
196196
platforms.Normalize(ocispec.Platform{OS: image.OS, Architecture: image.Architecture}))
197197
}
198198
return nil, nil
199-
}), ChildrenHandler(provider)), image)
199+
}), ChildrenHandler(provider, "")), image)
200200
}
201201

202202
// RootFS returns the unpacked diffids that make up and images rootfs.

0 commit comments

Comments
 (0)
X Tutup