dotcloud/docker

View on GitHub
contrib/nuke-graph-directory.sh

Summary

Maintainability
Test Coverage
#!/usr/bin/env bash
set -e

dir="$1"

if [ -z "$dir" ]; then
    {
        echo 'This script is for destroying old /var/lib/docker directories more safely than'
        echo '  "rm -rf", which can cause data loss or other serious issues.'
        echo
        echo "usage: $0 directory"
        echo "   ie: $0 /var/lib/docker"
    } >&2
    exit 1
fi

if [ "$(id -u)" != 0 ]; then
    echo >&2 "error: $0 must be run as root"
    exit 1
fi

if [ ! -d "$dir" ]; then
    echo >&2 "error: $dir is not a directory"
    exit 1
fi

dir="$(readlink -f "$dir")"

echo
echo "Nuking $dir ..."
echo '  (if this is wrong, press Ctrl+C NOW!)'
echo

(
    set -x
    sleep 10
)
echo

dir_in_dir() {
    inner="$1"
    outer="$2"
    [ "${inner#$outer}" != "$inner" ]
}

# let's start by unmounting any submounts in $dir
#   (like -v /home:... for example - DON'T DELETE MY HOME DIRECTORY BRU!)
for mount in $(awk '{ print $5 }' /proc/self/mountinfo); do
    mount="$(readlink -f "$mount" || true)"
    if [ "$dir" != "$mount" ] && dir_in_dir "$mount" "$dir"; then
        (
            set -x
            umount -f "$mount"
        )
    fi
done

# now, let's go destroy individual btrfs subvolumes, if any exist
if command -v btrfs > /dev/null 2>&1; then
    # Find btrfs subvolumes under $dir checking for inode 256
    # Source: http://stackoverflow.com/a/32865333
    for subvol in $(find "$dir" -type d -inum 256 | sort -r); do
        if [ "$dir" != "$subvol" ] && subvolType="$(stat -f --format=%T "$subvol")" && [ "$subvolType" = "btrfs" ]; then
            (
                set -x
                btrfs subvolume delete "$subvol"
            )
        fi
    done
fi

# finally, DESTROY ALL THINGS
(
    shopt -s dotglob
    set -x
    rm -rf "$dir"/*
)