github.com/moby/docker@v26.1.3+incompatible/daemon/containerd/image_children.go (about) 1 package containerd 2 3 import ( 4 "context" 5 6 containerdimages "github.com/containerd/containerd/images" 7 "github.com/docker/docker/errdefs" 8 "github.com/docker/docker/image" 9 "github.com/opencontainers/go-digest" 10 "github.com/pkg/errors" 11 ) 12 13 // getImagesWithLabel returns all images that have the matching label key and value. 14 func (i *ImageService) getImagesWithLabel(ctx context.Context, labelKey string, labelValue string) ([]image.ID, error) { 15 imgs, err := i.images.List(ctx, "labels."+labelKey+"=="+labelValue) 16 17 if err != nil { 18 return []image.ID{}, errdefs.System(errors.Wrap(err, "failed to list all images")) 19 } 20 21 var children []image.ID 22 for _, img := range imgs { 23 children = append(children, image.ID(img.Target.Digest)) 24 } 25 26 return children, nil 27 } 28 29 // Children returns a slice of image IDs that are children of the `id` image 30 func (i *ImageService) Children(ctx context.Context, id image.ID) ([]image.ID, error) { 31 return i.getImagesWithLabel(ctx, imageLabelClassicBuilderParent, string(id)) 32 } 33 34 // parents returns a slice of image IDs that are parents of the `id` image 35 // 36 // Called from image_delete.go to prune dangling parents. 37 func (i *ImageService) parents(ctx context.Context, id image.ID) ([]containerdimages.Image, error) { 38 targetImage, err := i.resolveImage(ctx, id.String()) 39 if err != nil { 40 return nil, errors.Wrap(err, "failed to get child image") 41 } 42 43 var imgs []containerdimages.Image 44 for { 45 parent, ok := targetImage.Labels[imageLabelClassicBuilderParent] 46 if !ok || parent == "" { 47 break 48 } 49 50 parentDigest, err := digest.Parse(parent) 51 if err != nil { 52 return nil, err 53 } 54 img, err := i.resolveImage(ctx, parentDigest.String()) 55 if err != nil { 56 return nil, err 57 } 58 imgs = append(imgs, img) 59 targetImage = img 60 } 61 62 return imgs, nil 63 }