// Removes the oldest toRemove containers and returns the resulting slice. func (cgc *realContainerGC) removeOldestN(containers []containerGCInfo, toRemove int) []containerGCInfo { // Remove from oldest to newest (last to first). numToKeep := len(containers) - toRemove for i := numToKeep; i < len(containers); i++ { err := cgc.dockerClient.RemoveContainer(docker.RemoveContainerOptions{ID: containers[i].id, RemoveVolumes: true}) if err != nil { glog.Warningf("Failed to remove dead container %q: %v", containers[i].name, err) } symlinkPath := dockertools.LogSymlink(cgc.containerLogsDir, containers[i].podNameWithNamespace, containers[i].containerName, containers[i].id) err = os.Remove(symlinkPath) if err != nil && !os.IsNotExist(err) { glog.Warningf("Failed to remove container %q log symlink %q: %v", containers[i].name, symlinkPath, err) } } // Assume we removed the containers so that we're not too aggressive. return containers[:numToKeep] }
// legacyLogSymlink composes the legacy container log path. It is only used for legacy cluster // logging support. func legacyLogSymlink(containerID string, containerName, podName, podNamespace string) string { return dockertools.LogSymlink(legacyContainerLogsDir, kubecontainer.BuildPodFullName(podName, podNamespace), containerName, containerID) }