in cleanup.go [363:434]
func doFreeSpace(client DockerClient, freeSpace, freeFiles uint64) error {
images, err := client.ListImages(docker.ListImagesOptions{})
if err != nil {
logrus.Warningln("Failed to list images:", err)
return err
}
containers, err := client.ListContainers(docker.ListContainersOptions{
All: true,
})
if err != nil {
logrus.Warningln("Failed to list containers:", err)
return err
}
var lastError error
for {
diskSpace, err := client.DiskSpace(opts.MonitorPath)
if err != nil {
return err
}
if diskSpace.BytesFree > freeSpace && diskSpace.FilesFree > freeFiles {
break
}
var bestScore int64 = -1
bestImageIndex := -1
bestCacheIndex := -1
for idx, image := range images {
if isInternalImage(image) {
continue
}
if imageInfo, ok := imagesUsed[image.ID]; ok {
score := imageInfo.score()
if score > bestScore {
bestImageIndex = idx
bestCacheIndex = -1
bestScore = score
}
}
}
for idx, container := range containers {
if !isCacheContainer(container.Names...) {
continue
}
if cacheInfo, ok := cachesUsed[container.ID]; ok {
score := cacheInfo.score()
if score > bestScore {
bestImageIndex = -1
bestCacheIndex = idx
bestScore = score
}
}
}
logrus.Debugln("doFreeCycle", bestScore, bestImageIndex, bestCacheIndex)
if bestImageIndex >= 0 {
lastError = removeImage(client, images[bestImageIndex])
images = append(images[0:bestImageIndex], images[bestImageIndex+1:len(images)]...)
} else if bestCacheIndex >= 0 {
lastError = removeCache(client, containers[bestCacheIndex])
containers = append(containers[0:bestCacheIndex], containers[bestCacheIndex+1:len(containers)]...)
} else {
lastError = errors.New("no images or caches to delete")
break
}
}
return lastError
}