X Tutup
Skip to content

Commit 13771fb

Browse files
committed
images, remotes: add support for foreign layers
Add support for downloading layers with external URLs and foreign/non-distributable mediatypes. This ensures that encountered windows images are downloaded correctly. We still need to filter out the extra windows resources when pulling linux, but this is a step towards correctly supporting multi-platform images. Signed-off-by: Stephen J Day <stephen.day@docker.com>
1 parent 9934acb commit 13771fb

File tree

4 files changed

+28
-14
lines changed

4 files changed

+28
-14
lines changed

images/handlers.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,10 @@ func ChildrenHandler(provider content.Provider) HandlerFunc {
159159

160160
descs = append(descs, index.Manifests...)
161161
case MediaTypeDockerSchema2Layer, MediaTypeDockerSchema2LayerGzip,
162+
MediaTypeDockerSchema2LayerForeign, MediaTypeDockerSchema2LayerForeignGzip,
162163
MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig,
163-
ocispec.MediaTypeImageLayer, ocispec.MediaTypeImageLayerGzip:
164+
ocispec.MediaTypeImageLayer, ocispec.MediaTypeImageLayerGzip,
165+
ocispec.MediaTypeImageLayerNonDistributable, ocispec.MediaTypeImageLayerNonDistributableGzip:
164166
// childless data types.
165167
return nil, nil
166168
default:

images/mediatypes.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ package images
55
// oci components are generally referenced directly, although we may centralize
66
// here for clarity.
77
const (
8-
MediaTypeDockerSchema2Layer = "application/vnd.docker.image.rootfs.diff.tar"
9-
MediaTypeDockerSchema2LayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip"
10-
MediaTypeDockerSchema2Config = "application/vnd.docker.container.image.v1+json"
11-
MediaTypeDockerSchema2Manifest = "application/vnd.docker.distribution.manifest.v2+json"
12-
MediaTypeDockerSchema2ManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
8+
MediaTypeDockerSchema2Layer = "application/vnd.docker.image.rootfs.diff.tar"
9+
MediaTypeDockerSchema2LayerForeign = "application/vnd.docker.image.rootfs.foreign.diff.tar"
10+
MediaTypeDockerSchema2LayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip"
11+
MediaTypeDockerSchema2LayerForeignGzip = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip"
12+
MediaTypeDockerSchema2Config = "application/vnd.docker.container.image.v1+json"
13+
MediaTypeDockerSchema2Manifest = "application/vnd.docker.distribution.manifest.v2+json"
14+
MediaTypeDockerSchema2ManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
1315
// Checkpoint/Restore Media Types
1416
MediaTypeContainerd1Checkpoint = "application/vnd.containerd.container.criu.checkpoint.criu.tar"
1517
MediaTypeContainerd1CheckpointPreDump = "application/vnd.containerd.container.criu.checkpoint.predump.tar"

remotes/docker/fetcher.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path"
88
"strings"
99

10+
"github.com/containerd/containerd/errdefs"
1011
"github.com/containerd/containerd/images"
1112
"github.com/containerd/containerd/log"
1213
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
@@ -26,7 +27,7 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
2627
},
2728
))
2829

29-
paths, err := getV2URLPaths(desc)
30+
urls, err := r.getV2URLPaths(ctx, desc)
3031
if err != nil {
3132
return nil, err
3233
}
@@ -36,9 +37,7 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
3637
return nil, err
3738
}
3839

39-
for _, path := range paths {
40-
u := r.url(path)
41-
40+
for _, u := range urls {
4241
req, err := http.NewRequest(http.MethodGet, u, nil)
4342
if err != nil {
4443
return nil, err
@@ -61,24 +60,34 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
6160
return resp.Body, nil
6261
}
6362

64-
return nil, errors.New("not found")
63+
return nil, errors.Wrapf(errdefs.ErrNotFound,
64+
"could not fetch content descriptor %v (%v) from remote",
65+
desc.Digest, desc.MediaType)
6566
}
6667

6768
// getV2URLPaths generates the candidate urls paths for the object based on the
6869
// set of hints and the provided object id. URLs are returned in the order of
6970
// most to least likely succeed.
70-
func getV2URLPaths(desc ocispec.Descriptor) ([]string, error) {
71+
func (r *dockerFetcher) getV2URLPaths(ctx context.Context, desc ocispec.Descriptor) ([]string, error) {
7172
var urls []string
7273

74+
if len(desc.URLs) > 0 {
75+
// handle fetch via external urls.
76+
for _, u := range desc.URLs {
77+
log.G(ctx).WithField("url", u).Debug("adding alternative url")
78+
urls = append(urls, u)
79+
}
80+
}
81+
7382
switch desc.MediaType {
7483
case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList,
7584
images.MediaTypeDockerSchema1Manifest,
7685
ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex:
77-
urls = append(urls, path.Join("manifests", desc.Digest.String()))
86+
urls = append(urls, r.url(path.Join("manifests", desc.Digest.String())))
7887
}
7988

8089
// always fallback to attempting to get the object out of the blobs store.
81-
urls = append(urls, path.Join("blobs", desc.Digest.String()))
90+
urls = append(urls, r.url(path.Join("blobs", desc.Digest.String())))
8291

8392
return urls, nil
8493
}

remotes/handlers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string {
2727
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
2828
return "index-" + desc.Digest.String()
2929
case images.MediaTypeDockerSchema2Layer, images.MediaTypeDockerSchema2LayerGzip,
30+
images.MediaTypeDockerSchema2LayerForeign, images.MediaTypeDockerSchema2LayerForeignGzip,
3031
ocispec.MediaTypeImageLayer, ocispec.MediaTypeImageLayerGzip,
3132
ocispec.MediaTypeImageLayerNonDistributable, ocispec.MediaTypeImageLayerNonDistributableGzip:
3233
return "layer-" + desc.Digest.String()

0 commit comments

Comments
 (0)
X Tutup