#!/bin/bash
# Define the overlay2 directory
overlay_dir="/var/lib/docker/overlay2"
# Verify that the overlay2 directory exists
if [ ! -d "$overlay_dir" ]; then
echo "The directory $overlay_dir does not exist. Please check the path."
exit 1
fi
# Get all layer IDs associated with current containers (MergedDir, LowerDir, UpperDir, WorkDir)
container_layer_ids=$(docker ps -qa | xargs docker inspect --format '{{ .GraphDriver.Data.MergedDir }} {{ .GraphDriver.Data.LowerDir }} {{ .GraphDriver.Data.UpperDir }} {{ .GraphDriver.Data.WorkDir }}' | tr ' ' '\n' | tr ':' '\n' | awk -F'/' '{print $(NF-1)}' | sort | uniq)
# Get all layer IDs associated with images
image_layer_ids=$(docker images -qa | xargs docker inspect --format '{{ .GraphDriver.Data.MergedDir }} {{ .GraphDriver.Data.LowerDir }} {{ .GraphDriver.Data.UpperDir }} {{ .GraphDriver.Data.WorkDir }}' | tr ' ' '\n' | tr ':' '\n' | awk -F'/' '{print $(NF-1)}' | sort | uniq)
# Get all cache IDs of type source.local
source_local_cache_ids=$(docker system df -v | grep 'source.local' | awk '{print $1}' | sort | uniq)
# Combine the layer IDs of containers, images, and source.local caches
all_layer_ids=$(echo -e "$container_layer_ids\n$image_layer_ids" | sort | uniq)
# Verify if the retrieval of layer IDs was successful
if [ -z "$all_layer_ids" ]; then
echo "Error: Could not retrieve the directories of MergedDir, LowerDir, UpperDir, WorkDir, or source.local caches."
echo "Aborting to avoid accidental deletion of directories."
exit 1
fi
echo "source_local_cache_ids:"
echo "$source_local_cache_ids"
echo "all_layer_ids:"
echo "$all_layer_ids"
# List all subdirectories in overlay2
overlay_subdirs=$(ls -1 $overlay_dir)
# Find and remove orphan directories that are not in the list of active layers or caches
echo "Searching for and removing orphan directories in $overlay_dir..."
for dir in $overlay_subdirs; do
# Ignore directories ending in "-init" and the "l" directory
if [[ "$dir" == *"-init" ]] || [[ "$dir" == "l" ]]; then
echo "Ignoring special directory: $overlay_dir/$dir"
continue
fi
# Check if the directory name starts with any of the source.local cache IDs
preserve_dir=false
for cache_id in $source_local_cache_ids; do
if [[ "$dir" == "$cache_id"* ]]; then
preserve_dir=true
break
fi
done
# If directory should be preserved, skip it
if $preserve_dir; then
echo "Preserving cache directory: $overlay_dir/$dir"
continue
fi
# Check if the directory is associated with an active container or image
if ! echo "$all_layer_ids" | grep -q "$dir"; then
echo "Removing orphan directory: $overlay_dir/$dir"
# rm -rf "$overlay_dir/$dir"
fi
done
echo "Process completed."