Saber2pr's Blog

清理overlay2

#!/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."