146 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash -e
 | 
						|
 | 
						|
# template for bash scripts
 | 
						|
 | 
						|
# internal use only
 | 
						|
append_msg() {
 | 
						|
    if test $# -ne 0; then
 | 
						|
        echo -en ":\e[0m \e[1m$*"
 | 
						|
    fi
 | 
						|
    echo -e "\e[0m"
 | 
						|
}
 | 
						|
 | 
						|
# write a notice
 | 
						|
notice() {
 | 
						|
    if test $# -eq 0; then
 | 
						|
        return
 | 
						|
    fi
 | 
						|
    echo -e "\e[1m$*\e[0m" 1>&3
 | 
						|
}
 | 
						|
 | 
						|
# write error message
 | 
						|
error() {
 | 
						|
    echo -en "\e[1;31merror" 1>&2
 | 
						|
    append_msg $* 1>&2
 | 
						|
}
 | 
						|
 | 
						|
# write a warning message
 | 
						|
warning() {
 | 
						|
    echo -en "\e[1;33mwarning" 1>&2
 | 
						|
    append_msg $* 1>&2
 | 
						|
}
 | 
						|
 | 
						|
# write a success message
 | 
						|
success() {
 | 
						|
    echo -en "\e[1;32msuccess" 1>&2
 | 
						|
    append_msg $* 1>&2
 | 
						|
}
 | 
						|
 | 
						|
# default
 | 
						|
filter="until=168h"
 | 
						|
 | 
						|
# config file overwrites
 | 
						|
if test -e /etc/docker-prune.conf; then
 | 
						|
    . /etc/docker-prune.conf
 | 
						|
fi
 | 
						|
 | 
						|
# commandline parameter evaluation
 | 
						|
while test $# -gt 0; do
 | 
						|
    case "$1" in
 | 
						|
        (--help|-h) less <<EOF
 | 
						|
SYNOPSIS
 | 
						|
 | 
						|
  $0 [OPTIONS]
 | 
						|
 | 
						|
OPTIONS
 | 
						|
 | 
						|
  --help, -h                 show this help
 | 
						|
  --filter, -f <filter>      define filter (default: $filter)
 | 
						|
  --install, -i              install to daily crontab
 | 
						|
 | 
						|
DESCRIPTION
 | 
						|
 | 
						|
Cleanup docker. Removes all docker container that are not running,
 | 
						|
then removes all unused docker images.
 | 
						|
 | 
						|
EOF
 | 
						|
                    exit;;
 | 
						|
        (--filter|-f) shift; filter="$1";;
 | 
						|
        (--install|-i) sudo cp $0 /etc/cron.daily/docker-prune; exit;;
 | 
						|
        (*) error "unknow option $1, try $0 --help"; exit 1;;
 | 
						|
    esac
 | 
						|
    if test $# -eq 0; then
 | 
						|
        error "missing parameter, try $0 --help"; exit 1
 | 
						|
    fi
 | 
						|
    shift;
 | 
						|
done
 | 
						|
 | 
						|
# run a command, print the result and abort in case of error
 | 
						|
# option: --no-check: ignore the result, continue in case of error
 | 
						|
run() {
 | 
						|
    check=1
 | 
						|
    while test $# -gt 0; do
 | 
						|
        case "$1" in
 | 
						|
            (--no-check) check=0;;
 | 
						|
            (*) break;;
 | 
						|
        esac
 | 
						|
        shift;
 | 
						|
    done
 | 
						|
    echo -en "\e[1m-> running:\e[0m $* ..."
 | 
						|
    result=$($* 2>&1)
 | 
						|
    res=$?
 | 
						|
    if test $res -ne 0; then
 | 
						|
        if test $check -eq 1; then
 | 
						|
            error "failed with return code: $res"
 | 
						|
            if test -n "$result"; then
 | 
						|
                echo "$result"
 | 
						|
            fi
 | 
						|
            exit 1
 | 
						|
        else
 | 
						|
            warning "ignored return code: $res"
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        success
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# error handler
 | 
						|
function traperror() {
 | 
						|
    set +x
 | 
						|
    local err=($1) # error status
 | 
						|
    local line="$2" # LINENO
 | 
						|
    local linecallfunc="$3"
 | 
						|
    local command="$4"
 | 
						|
    local funcstack="$5"
 | 
						|
    for e in ${err[@]}; do
 | 
						|
        if test -n "$e" -a "$e" != "0"; then
 | 
						|
            error "line $line - command '$command' exited with status: $e (${err[@]})"
 | 
						|
            if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then
 | 
						|
                echo -n "   ... error at ${funcstack} "
 | 
						|
                if [ "$linecallfunc" != "" ]; then
 | 
						|
                    echo -n "called at line $linecallfunc"
 | 
						|
                fi
 | 
						|
                echo
 | 
						|
            fi
 | 
						|
            exit $e
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    success
 | 
						|
    exit 0
 | 
						|
}
 | 
						|
 | 
						|
# catch errors
 | 
						|
trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT
 | 
						|
 | 
						|
##########################################################################################
 | 
						|
 | 
						|
if test -z "$filter"; then
 | 
						|
    run docker container prune -f
 | 
						|
    run docker volume prune -f
 | 
						|
    run docker image prune -a -f
 | 
						|
else
 | 
						|
    run docker container prune -f --filter "$filter"
 | 
						|
    run docker volume prune -f
 | 
						|
    run docker image prune -a -f --filter "$filter"
 | 
						|
fi
 |