func doFreeSpace()

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
}