Explorar o código

Add support for schema 1 pull

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
Derek McGowan %!s(int64=7) %!d(string=hai) anos
pai
achega
96c65a3adf
Modificáronse 1 ficheiros con 31 adicións e 25 borrados
  1. 31 25
      builder/builder-next/adapters/containerimage/pull.go

+ 31 - 25
builder/builder-next/adapters/containerimage/pull.go

@@ -234,7 +234,12 @@ func (p *puller) resolve(ctx context.Context) error {
 			p.ref = origRef
 			p.ref = origRef
 		}
 		}
 
 
-		if p.config == nil {
+		// Schema 1 manifests cannot be resolved to an image config
+		// since the conversion must take place after all the content
+		// has been read.
+		// It may be possible to have a mapping between schema 1 manifests
+		// and the schema 2 manifests they are converted to.
+		if p.config == nil && p.desc.MediaType != images.MediaTypeDockerSchema1Manifest {
 			ref, err := distreference.WithDigest(ref, p.desc.Digest)
 			ref, err := distreference.WithDigest(ref, p.desc.Digest)
 			if err != nil {
 			if err != nil {
 				p.resolveErr = err
 				p.resolveErr = err
@@ -328,11 +333,22 @@ func (p *puller) Snapshot(ctx context.Context) (cache.ImmutableRef, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	// TODO: need a wrapper snapshot interface that combines content
-	// and snapshots as 1) buildkit shouldn't have a dependency on contentstore
-	// or 2) cachemanager should manage the contentstore
-	handlers := []images.Handler{
-		images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
+	var (
+		schema1Converter *schema1.Converter
+		handlers         []images.Handler
+	)
+	if p.desc.MediaType == images.MediaTypeDockerSchema1Manifest {
+		schema1Converter = schema1.NewConverter(p.is.ContentStore, fetcher)
+		handlers = append(handlers, schema1Converter)
+
+		// TODO: Optimize to do dispatch and integrate pulling with download manager,
+		// leverage existing blob mapping and layer storage
+	} else {
+
+		// TODO: need a wrapper snapshot interface that combines content
+		// and snapshots as 1) buildkit shouldn't have a dependency on contentstore
+		// or 2) cachemanager should manage the contentstore
+		handlers = append(handlers, images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 			switch desc.MediaType {
 			switch desc.MediaType {
 			case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest,
 			case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest,
 				images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex,
 				images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex,
@@ -342,25 +358,8 @@ func (p *puller) Snapshot(ctx context.Context) (cache.ImmutableRef, error) {
 			}
 			}
 			ongoing.add(desc)
 			ongoing.add(desc)
 			return nil, nil
 			return nil, nil
-		}),
-	}
-	// var schema1Converter *schema1.Converter
-	// if p.desc.MediaType == images.MediaTypeDockerSchema1Manifest {
-	// 	schema1Converter = schema1.NewConverter(p.is.ContentStore, fetcher)
-	// 	handlers = append(handlers, schema1Converter)
-	// } else {
-	// 	handlers = append(handlers,
-	// 		remotes.FetchHandler(p.is.ContentStore, fetcher),
-	//
-	// 		images.ChildrenHandler(p.is.ContentStore),
-	// 	)
-	// }
-	//
-	var schema1Converter *schema1.Converter
-	if p.desc.MediaType == images.MediaTypeDockerSchema1Manifest {
-		schema1Converter = schema1.NewConverter(p.is.ContentStore, fetcher)
-		handlers = append(handlers, schema1Converter)
-	} else {
+		}))
+
 		// Get all the children for a descriptor
 		// Get all the children for a descriptor
 		childrenHandler := images.ChildrenHandler(p.is.ContentStore)
 		childrenHandler := images.ChildrenHandler(p.is.ContentStore)
 		// Set any children labels for that content
 		// Set any children labels for that content
@@ -380,6 +379,13 @@ func (p *puller) Snapshot(ctx context.Context) (cache.ImmutableRef, error) {
 	}
 	}
 	defer stopProgress()
 	defer stopProgress()
 
 
+	if schema1Converter != nil {
+		p.desc, err = schema1Converter.Convert(ctx)
+		if err != nil {
+			return nil, err
+		}
+	}
+
 	mfst, err := images.Manifest(ctx, p.is.ContentStore, p.desc, platforms.Default())
 	mfst, err := images.Manifest(ctx, p.is.ContentStore, p.desc, platforms.Default())
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err