github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/domain/infra/abi/images_list.go (about) 1 package abi 2 3 import ( 4 "context" 5 6 "github.com/containers/common/libimage" 7 "github.com/hanks177/podman/v4/pkg/domain/entities" 8 "github.com/pkg/errors" 9 ) 10 11 func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) ([]*entities.ImageSummary, error) { 12 listImagesOptions := &libimage.ListImagesOptions{ 13 Filters: opts.Filter, 14 } 15 if !opts.All { 16 // Filter intermediate images unless we want to list *all*. 17 // NOTE: it's a positive filter, so `intermediate=false` means 18 // to display non-intermediate images. 19 listImagesOptions.Filters = append(listImagesOptions.Filters, "intermediate=false") 20 } 21 22 images, err := ir.Libpod.LibimageRuntime().ListImages(ctx, nil, listImagesOptions) 23 if err != nil { 24 return nil, err 25 } 26 27 summaries := []*entities.ImageSummary{} 28 for _, img := range images { 29 repoDigests, err := img.RepoDigests() 30 if err != nil { 31 return nil, errors.Wrapf(err, "getting repoDigests from image %q", img.ID()) 32 } 33 isDangling, err := img.IsDangling(ctx) 34 if err != nil { 35 return nil, errors.Wrapf(err, "error checking if image %q is dangling", img.ID()) 36 } 37 38 e := entities.ImageSummary{ 39 ID: img.ID(), 40 Created: img.Created().Unix(), 41 Dangling: isDangling, 42 Digest: string(img.Digest()), 43 RepoDigests: repoDigests, 44 History: img.NamesHistory(), 45 Names: img.Names(), 46 ReadOnly: img.IsReadOnly(), 47 SharedSize: 0, 48 RepoTags: img.Names(), // may include tags and digests 49 } 50 e.Labels, err = img.Labels(ctx) 51 if err != nil { 52 return nil, errors.Wrapf(err, "error retrieving label for image %q: you may need to remove the image to resolve the error", img.ID()) 53 } 54 55 ctnrs, err := img.Containers() 56 if err != nil { 57 return nil, errors.Wrapf(err, "error retrieving containers for image %q: you may need to remove the image to resolve the error", img.ID()) 58 } 59 e.Containers = len(ctnrs) 60 61 sz, err := img.Size() 62 if err != nil { 63 return nil, errors.Wrapf(err, "error retrieving size of image %q: you may need to remove the image to resolve the error", img.ID()) 64 } 65 e.Size = sz 66 // This is good enough for now, but has to be 67 // replaced later with correct calculation logic 68 e.VirtualSize = sz 69 70 parent, err := img.Parent(ctx) 71 if err != nil { 72 return nil, errors.Wrapf(err, "error retrieving parent of image %q: you may need to remove the image to resolve the error", img.ID()) 73 } 74 if parent != nil { 75 e.ParentId = parent.ID() 76 } 77 78 summaries = append(summaries, &e) 79 } 80 return summaries, nil 81 }