#!/bin/bash #TODO: group flags into one command # like -I == $i -a function usage() { cat << EOF Usage: $0 -hcCviIna Options: -h Show this help and exits -c Remove stopped containers -C Remove all containers -v Remove unused volumes -i Remove unused images -I Remove all images -n Remove unused networks -a All of the above, equivalent of -CvIn EOF exit 0 } function add_opt() { local RESULT RESULT="$(unset "1")" for o in "$@"; do if [ "$((RESULT & o))" == 0 ]; then RESULT="$((RESULT + o))" fi done echo "$RESULT" } if ! [ -w "/var/run/docker.sock" ] && [ "$EUID" != 0 ]; then exec sudo -- "$0" "$@" fi c=1 C=2 v=4 i=8 I=16 n=32 a="$((c + C + v + I + n))" CLEAN=0 while getopts hcCviIna o; do case "$o" in h) usage ;; c) CLEAN="$(add_opt "$CLEAN" "$c")" ;; C) CLEAN="$(add_opt "$CLEAN" "$c" "$C")" ;; v) CLEAN="$(add_opt "$CLEAN" "$v")" ;; i) CLEAN="$(add_opt "$CLEAN" "$i")" ;; I) CLEAN="$(add_opt "$CLEAN" "$I")" ;; n) CLEAN="$(add_opt "$CLEAN" "$n")" ;; a) CLEAN="$(add_opt "$CLEAN" "$c" "$C" "$v" "$I" "$n")" ;; *) exit 1 ;; esac done VALUES=( "$a" "$((c + i + n))" "$((c + I + n))" "$((c + v + n))" "$c" "$v" "$i" "$I" "$n" ) SYS="docker system" CON="docker container" VOL="docker volume" IMG="docker image" NET="docker network" PRUNE="prune -f" COMMANDS=( "$SYS $PRUNE -a --volumes" "$SYS $PRUNE" "$SYS $PRUNE -a" "$SYS $PRUNE --volumes" "$CON $PRUNE" "$VOL $PRUNE" "$IMG $PRUNE" "$IMG $PRUNE -a" "$NET $PRUNE" ) if [ "$((CLEAN & "$C"))" == "$C" ]; then $CON ls -aq | xargs $CON stop fi for idx in "${!VALUES[@]}"; do mask="${VALUES[$idx]}" if [ "$((CLEAN & mask))" == "$mask" ]; then bash -c "${COMMANDS[$idx]}" CLEAN="$((CLEAN - mask))" fi done