@@ -77,21 +77,19 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
7777 return nil , err
7878 }
7979
80- var allImages map [image.ID ]* image.Image
80+ var selectedImages map [image.ID ]* image.Image
8181 if danglingOnly {
82- allImages = i .imageStore .Heads ()
82+ selectedImages = i .imageStore .Heads ()
8383 } else {
84- allImages = i .imageStore .Map ()
84+ selectedImages = i .imageStore .Map ()
8585 }
8686
8787 var (
88- summaries []* types.ImageSummary
88+ summaries = make ( []* types.ImageSummary , 0 , len ( selectedImages ))
8989 summaryMap map [* image.Image ]* types.ImageSummary
90- layerRefs map [layer.ChainID ]int
91- allLayers map [layer.ChainID ]layer.Layer
9290 allContainers []* container.Container
9391 )
94- for id , img := range allImages {
92+ for id , img := range selectedImages {
9593 if beforeFilter != nil {
9694 if img .Created .Equal (beforeFilter .Created ) || img .Created .After (beforeFilter .Created ) {
9795 continue
@@ -187,12 +185,10 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
187185 }
188186
189187 if withExtraAttrs {
190- // lazily init variables
188+ // Lazily init summaryMap and allContainers
191189 if summaryMap == nil {
190+ summaryMap = make (map [* image.Image ]* types.ImageSummary , len (selectedImages ))
192191 allContainers = i .containers .List ()
193- allLayers = i .layerStore .Map ()
194- summaryMap = make (map [* image.Image ]* types.ImageSummary )
195- layerRefs = make (map [layer.ChainID ]int )
196192 }
197193
198194 // Get container count
@@ -205,19 +201,33 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
205201 // NOTE: By default, Containers is -1, or "not set"
206202 summary .Containers = containers
207203
208- // count layer references
204+ summaryMap [img ] = summary
205+ }
206+ summaries = append (summaries , summary )
207+ }
208+
209+ if withExtraAttrs {
210+ allLayers := i .layerStore .Map ()
211+ layerRefs := make (map [layer.ChainID ]int , len (allLayers ))
212+
213+ allImages := selectedImages
214+ if danglingOnly {
215+ // If danglingOnly is true, then selectedImages include only dangling images,
216+ // but we need to consider all existing images to correctly perform reference counting.
217+ // If danglingOnly is false, selectedImages (and, hence, allImages) is already equal to i.imageStore.Map()
218+ // and we can avoid performing an otherwise redundant method call.
219+ allImages = i .imageStore .Map ()
220+ }
221+ // Count layer references across all known images
222+ for _ , img := range allImages {
209223 rootFS := * img .RootFS
210224 rootFS .DiffIDs = nil
211225 for _ , id := range img .RootFS .DiffIDs {
212226 rootFS .Append (id )
213227 layerRefs [rootFS .ChainID ()]++
214228 }
215- summaryMap [img ] = summary
216229 }
217- summaries = append (summaries , summary )
218- }
219230
220- if withExtraAttrs {
221231 // Get Shared sizes
222232 for img , summary := range summaryMap {
223233 rootFS := * img .RootFS
0 commit comments