@@ -312,6 +312,7 @@ func (imageManager *dockerImageManager) removeUnusedImages(ctx context.Context)
312
312
313
313
var numECSImagesDeleted int
314
314
imageManager .imageStatesConsideredForDeletion = imageManager .imagesConsiderForDeletion (imageManager .getAllImageStates ())
315
+
315
316
for i := 0 ; i < imageManager .numImagesToDelete ; i ++ {
316
317
err := imageManager .removeLeastRecentlyUsedImage (ctx )
317
318
numECSImagesDeleted = i
@@ -342,9 +343,13 @@ func (imageManager *dockerImageManager) removeNonECSContainers(ctx context.Conte
342
343
continue
343
344
}
344
345
345
- finishedTime , _ := time .Parse (time .Now ().String (), response .State .FinishedAt )
346
+ seelog .Infof ("Inspecting Non-ECS Container ID [%s] for removal, Finished [%s] Status [%s]" , id , response .State .FinishedAt , response .State .Status )
347
+ finishedTime , err := time .Parse (time .RFC3339Nano , response .State .FinishedAt )
348
+ if err != nil {
349
+ seelog .Errorf ("Error parsing time string for container. id: %s, time: %s err: %s" , id , response .State .FinishedAt , err )
350
+ }
346
351
347
- if response .State .Status == "exited" && time .Now ().Sub (finishedTime ) > imageManager .nonECSContainerCleanupWaitDuration {
352
+ if ( response .State .Status == "exited" || response . State . Status == "dead" || response . State . Status == "created" ) && time .Now ().Sub (finishedTime ) > imageManager .nonECSContainerCleanupWaitDuration {
348
353
nonECSContainerRemoveAvailableIDs = append (nonECSContainerRemoveAvailableIDs , id )
349
354
}
350
355
}
@@ -353,13 +358,13 @@ func (imageManager *dockerImageManager) removeNonECSContainers(ctx context.Conte
353
358
if numNonECSContainerDeleted == imageManager .numNonECSContainersToDelete {
354
359
break
355
360
}
356
- seelog .Infof ("Removing non-ECS container id: %s" , id )
361
+ seelog .Debugf ("Removing non-ECS Container ID %s" , id )
357
362
err := imageManager .client .RemoveContainer (ctx , id , dockerclient .RemoveContainerTimeout )
358
363
if err == nil {
359
- seelog .Infof ("Image removed : %s" , id )
364
+ seelog .Infof ("Container ID Removed : %s" , id )
360
365
numNonECSContainerDeleted ++
361
366
} else {
362
- seelog .Errorf ("Error removing Image %s - %v " , id , err )
367
+ seelog .Errorf ("Error Removing Container ID %s - %s " , id , err )
363
368
continue
364
369
}
365
370
}
@@ -379,70 +384,75 @@ func (imageManager *dockerImageManager) getNonECSContainerIDs(ctx context.Contex
379
384
return nonECSContainersIDs , nil
380
385
}
381
386
382
- type ImageWithSize struct {
387
+ type ImageWithSizeID struct {
383
388
ImageName string
389
+ ImageID string
384
390
Size int64
385
391
}
386
392
387
393
func (imageManager * dockerImageManager ) removeNonECSImages (ctx context.Context , nonECSImagesNumToDelete int ) {
388
394
if nonECSImagesNumToDelete == 0 {
389
395
return
390
396
}
391
- var nonECSImageNames = imageManager .getNonECSImageNames (ctx )
392
- var nonECSImageNamesRemoveEligible []string
393
- for _ , nonECSImage := range nonECSImageNames {
394
- if ! isInExclusionList (nonECSImage , imageManager .imageCleanupExclusionList ) {
395
- nonECSImageNamesRemoveEligible = append (nonECSImageNamesRemoveEligible , nonECSImage )
397
+ nonECSImages : = imageManager .getNonECSImages (ctx )
398
+ var nonECSImagesRmEligible []ImageWithSizeID
399
+ for _ , nonECSImage := range nonECSImages {
400
+ if ! isInExclusionList (nonECSImage . ImageName , imageManager .imageCleanupExclusionList ) {
401
+ nonECSImagesRmEligible = append (nonECSImagesRmEligible , nonECSImage )
396
402
}
397
403
}
398
404
399
- var imageWithSizeList [] ImageWithSize
400
- for _ , imageName := range nonECSImageNamesRemoveEligible {
401
- resp , iiErr := imageManager .client .InspectImage (imageName )
402
- if iiErr != nil {
403
- seelog .Errorf ("Error inspecting non-ECS image name : %s - %v " , imageName , iiErr )
405
+ // Get the all image sizes
406
+ for _ , image := range nonECSImagesRmEligible {
407
+ resp , err := imageManager .client .InspectImage (image . ImageID )
408
+ if err != nil {
409
+ seelog .Errorf ("Error inspecting non-ECS image: %s (%s), %s " , image . ImageName , image . ImageID , err )
404
410
continue
405
411
}
406
- imageWithSizeList = append ( imageWithSizeList , ImageWithSize { imageName , resp .Size })
412
+ image . Size = resp .Size
407
413
}
408
414
// we want to sort images with size ascending
409
- sort .Slice (imageWithSizeList , func (i , j int ) bool {
410
- return imageWithSizeList [i ].Size < imageWithSizeList [j ].Size
415
+ sort .Slice (nonECSImagesRmEligible , func (i , j int ) bool {
416
+ return nonECSImagesRmEligible [i ].Size < nonECSImagesRmEligible [j ].Size
411
417
})
412
418
413
419
// we will remove the remaining nonECSImages in each performPeriodicImageCleanup call()
414
420
var numImagesAlreadyDeleted = 0
415
- for _ , kv := range imageWithSizeList {
421
+ for _ , kv := range nonECSImagesRmEligible {
416
422
if numImagesAlreadyDeleted == nonECSImagesNumToDelete {
417
423
break
418
424
}
419
- seelog .Infof ("Removing non-ECS Image: %s" , kv .ImageName )
420
- err := imageManager .client .RemoveImage (ctx , kv .ImageName , dockerclient .RemoveImageTimeout )
425
+ seelog .Infof ("Removing non-ECS Image: %s (%s) " , kv .ImageName , kv . ImageID )
426
+ err := imageManager .client .RemoveImage (ctx , kv .ImageID , dockerclient .RemoveImageTimeout )
421
427
if err != nil {
422
- seelog .Errorf ("Error removing Image %s - %v" , kv .ImageName , err )
428
+ seelog .Errorf ("Error removing Image %s (%s) - %v" , kv .ImageName , kv . ImageID , err )
423
429
continue
424
430
} else {
425
- seelog .Infof ("Image removed: %s" , kv .ImageName )
431
+ seelog .Infof ("Image removed: %s (%s) " , kv .ImageName , kv . ImageID )
426
432
numImagesAlreadyDeleted ++
427
433
}
428
434
}
429
435
}
430
436
431
- func (imageManager * dockerImageManager ) getNonECSImageNames (ctx context.Context ) []string {
432
- response := imageManager .client .ListImages (ctx , dockerclient .ListImagesTimeout )
433
- var allImagesNames []string
434
- for _ , name := range response .RepoTags {
435
- allImagesNames = append (allImagesNames , name )
437
+ // getNonECSImages returns type ImageWithSizeID but does NOT populate the Size field.
438
+ func (imageManager * dockerImageManager ) getNonECSImages (ctx context.Context ) []ImageWithSizeID {
439
+ r := imageManager .client .ListImages (ctx , dockerclient .ListImagesTimeout )
440
+ var allImages []ImageWithSizeID
441
+ for i := 0 ; i < len (r .RepoTags ); i ++ {
442
+ allImages = append (allImages , ImageWithSizeID {ImageName : r .RepoTags [i ], ImageID : r .ImageIDs [i ]})
436
443
}
437
- var ecsImageNames []string
444
+ var ecsImageIDs []string
438
445
for _ , imageState := range imageManager .getAllImageStates () {
439
- for _ , imageName := range imageState .Image .Names {
440
- ecsImageNames = append (ecsImageNames , imageName )
441
- }
446
+ ecsImageIDs = append (ecsImageIDs , imageState .Image .ImageID )
442
447
}
443
448
444
- var nonECSImageNames = exclude (allImagesNames , ecsImageNames )
445
- return nonECSImageNames
449
+ var nonECSImages []ImageWithSizeID
450
+ for _ , image := range allImages {
451
+ if ! isInExclusionList (image .ImageID , ecsImageIDs ) {
452
+ nonECSImages = append (nonECSImages , image )
453
+ }
454
+ }
455
+ return nonECSImages
446
456
}
447
457
448
458
func isInExclusionList (imageName string , imageExclusionList []string ) bool {
@@ -477,8 +487,9 @@ func (imageManager *dockerImageManager) imagesConsiderForDeletion(allImageStates
477
487
for _ , imageState := range allImageStates {
478
488
if imageManager .isExcludedFromCleanup (imageState ) {
479
489
//imageState that we want to keep
480
- seelog .Infof ("Image excluded from deletion: [%s]" , imageState .String ())
490
+ seelog .Debugf ("Image excluded from deletion: [%s]" , imageState .String ())
481
491
} else {
492
+ seelog .Debugf ("Image going to be considered for deletion: [%s]" , imageState .String ())
482
493
imagesConsiderForDeletionMap [imageState .Image .ImageID ] = imageState
483
494
}
484
495
}
0 commit comments