storage/storage_image.go
func (s *storageImageSource) LayerInfosForCopy(ctx context.Context) ([]types.BlobInfo, error) {
	manifestBlob, manifestType, err := s.GetManifest(ctx, nil)
	if err != nil {
		return nil, errors.Wrapf(err, "error reading image manifest for %q", s.image.ID)
	}
	man, err := manifest.FromBlob(manifestBlob, manifestType)
	if err != nil {
		return nil, errors.Wrapf(err, "error parsing image manifest for %q", s.image.ID)
	}

	uncompressedLayerType := ""
	switch manifestType {
	case imgspecv1.MediaTypeImageManifest:
		uncompressedLayerType = imgspecv1.MediaTypeImageLayer
	case manifest.DockerV2Schema1MediaType, manifest.DockerV2Schema1SignedMediaType, manifest.DockerV2Schema2MediaType:
		// This is actually a compressed type, but there's no uncompressed type defined
		uncompressedLayerType = manifest.DockerV2Schema2LayerMediaType
	}

	physicalBlobInfos := []types.BlobInfo{}
	layerID := s.image.TopLayer
	for layerID != "" {
		layer, err := s.imageRef.transport.store.Layer(layerID)
		if err != nil {
			return nil, errors.Wrapf(err, "error reading layer %q in image %q", layerID, s.image.ID)
		}
		if layer.UncompressedDigest == "" {
			return nil, errors.Errorf("uncompressed digest for layer %q is unknown", layerID)
		}
		if layer.UncompressedSize < 0 {
			return nil, errors.Errorf("uncompressed size for layer %q is unknown", layerID)
		}
		blobInfo := types.BlobInfo{
			Digest:    layer.UncompressedDigest,
			Size:      layer.UncompressedSize,
			MediaType: uncompressedLayerType,
		}
		physicalBlobInfos = append([]types.BlobInfo{blobInfo}, physicalBlobInfos...)
		layerID = layer.Parent
	}

	res, err := buildLayerInfosForCopy(man.LayerInfos(), physicalBlobInfos)
	if err != nil {
		return nil, errors.Wrapf(err, "error creating LayerInfosForCopy of image %q", s.image.ID)
	}
	return res, nil
}
func (s *storageImageSource) LayerInfosForCopy(ctx context.Context) ([]types.BlobInfo, error) {
	manifestBlob, manifestType, err := s.GetManifest(ctx, nil)
	if err != nil {
		return nil, errors.Wrapf(err, "error reading image manifest for %q", s.image.ID)
	}
	man, err := manifest.FromBlob(manifestBlob, manifestType)
	if err != nil {
		return nil, errors.Wrapf(err, "error parsing image manifest for %q", s.image.ID)
	}

	uncompressedLayerType := ""
	switch manifestType {
	case imgspecv1.MediaTypeImageManifest:
		uncompressedLayerType = imgspecv1.MediaTypeImageLayer
	case manifest.DockerV2Schema1MediaType, manifest.DockerV2Schema1SignedMediaType, manifest.DockerV2Schema2MediaType:
		// This is actually a compressed type, but there's no uncompressed type defined
		uncompressedLayerType = manifest.DockerV2Schema2LayerMediaType
	}

	physicalBlobInfos := []types.BlobInfo{}
	layerID := s.image.TopLayer
	for layerID != "" {
		layer, err := s.imageRef.transport.store.Layer(layerID)
		if err != nil {
			return nil, errors.Wrapf(err, "error reading layer %q in image %q", layerID, s.image.ID)
		}
		if layer.UncompressedDigest == "" {
			return nil, errors.Errorf("uncompressed digest for layer %q is unknown", layerID)
		}
		if layer.UncompressedSize < 0 {
			return nil, errors.Errorf("uncompressed size for layer %q is unknown", layerID)
		}
		blobInfo := types.BlobInfo{
			Digest:    layer.UncompressedDigest,
			Size:      layer.UncompressedSize,
			MediaType: uncompressedLayerType,
		}
		physicalBlobInfos = append([]types.BlobInfo{blobInfo}, physicalBlobInfos...)
		layerID = layer.Parent
	}

	res, err := buildLayerInfosForCopy(man.LayerInfos(), physicalBlobInfos)
	if err != nil {
		return nil, errors.Wrapf(err, "error creating LayerInfosForCopy of image %q", s.image.ID)
	}
	return res, nil
}
func ( s * storageImageSource ) LayerInfosForCopy ( ctx context . Context ) ( [ ] types . BlobInfo , error ) { manifestBlob , manifestType , err := s . GetManifest ( ctx , nil ) if err != nil { return nil , errors . Wrapf ( err , " " , s . image . ID ) } man , err := manifest . FromBlob ( manifestBlob , manifestType ) if err != nil { return nil , errors . Wrapf ( err , " " , s . image . ID ) } uncompressedLayerType := " " switch manifestType { case imgspecv1 . MediaTypeImageManifest : uncompressedLayerType = imgspecv1 . MediaTypeImageLayer case manifest . DockerV2Schema1MediaType , manifest . DockerV2Schema1SignedMediaType , manifest . DockerV2Schema2MediaType : // This is actually a compressed type, but there's no uncompressed type defined uncompressedLayerType = manifest . DockerV2Schema2LayerMediaType } physicalBlobInfos := [ ] types . BlobInfo { } layerID := s . image . TopLayer for layerID != " " { layer , err := s . imageRef . transport . store . Layer ( layerID ) if err != nil { return nil , errors . Wrapf ( err , " " , layerID , s . image . ID ) } if layer . UncompressedDigest == " " { return nil , errors . Errorf ( " " , layerID ) } if layer . UncompressedSize < 0 { return nil , errors . Errorf ( " " , layerID ) } blobInfo := types . BlobInfo { Digest : layer . UncompressedDigest , Size : layer . UncompressedSize , MediaType : uncompressedLayerType , } physicalBlobInfos = append ( [ ] types . BlobInfo { blobInfo } , physicalBlobInfos ... ) layerID = layer . Parent } res , err := buildLayerInfosForCopy ( man . LayerInfos ( ) , physicalBlobInfos ) if err != nil { return nil , errors . Wrapf ( err , " " , s . image . ID ) } return res , nil }
// LayerInfosForCopy() returns the list of layer blobs that make up the root filesystem of
// the image, after they've been decompressed.
LayerInfosForCopy () returns the list of layer blobs that make up the root filesystem of the image after they ve been decompressed .