Docker CLI

Definition file dc.def

# Docker

# -------------------------------------------------------------------------------------------------
= IMAGES
# -------------------------------------------------------------------------------------------------

list images (li) [<name>] :: \
    if [[ "$1" == "" ]]; then \
        docker images; \
    else \
        filter="${1//\*/.\*}"; \
        filter="${filter//%/.\*}"; \
        docker images 2>/dev/null | egrep "^$filter .*|IMAGE"; \
    fi \
    ## Use % or * as wildcards

# -------------------------------------------------------------------------------------------------
= CONTAINERS
# -------------------------------------------------------------------------------------------------

delete container (rm) <container_name> :: \
    read -p "Are you sure [yN]? " yn; \
    if [[ ${yn^} == Y ]]; then \
        docker rm $1; \
    fi \
    !! docker ps --all --format '{{.Names}}' \

list containers (ps) [<-d>] :: \
    if [[ $1 == -d ]]; then docker ps --all; \ 
    else \
        tmp="$(docker ps --all --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Size}}')"; \
        echo "$tmp" | head -n1; \
        echo "$tmp" | tail -n+2 | grep 'Up [0-9]* min' | sort -k2,2; \
        echo "$tmp" | tail -n+2 | grep -v 'Up [0-9]* min' | sort -k 2,2; \
    fi \
    ## -d: show details

logs (lo) [<-f>] <container-name> :: \
    if [[ $1 == -f ]]; then docker logs -f $2; else docker logs $1; fi \
    !! docker ps --all --format '{{.Names}}' \
    ## -f: follow log

errs (er) [<-f>] :: \
    echo "" > /tmp/docker_err_p; \
    while [[ true ]]; do \
        for c in $(docker ps --format '{{.Names}}'); do \
            docker logs $c 2>&1 | grep "ERROR:" | sed "s/^/$c: /"; \
        done > /tmp/docker_err_c; \
        grep -Fxvf /tmp/docker_err_p /tmp/docker_err_c; \
        mv -f /tmp/docker_err_c /tmp/docker_err_p; \
        if [[ $1 != -f ]]; then break; fi; \
        sleep 2; \
    done

pull container (pu) <container_name> :: \
    docker pull $1

rename container (mv) <current_name> <new_name> :: \
    docker rename $1 $2 \
    !! docker ps --all --format '{{.Names}}'

restart container (re) <container_name> :: \
    docker restart $1 \
    !! docker ps --all --format '{{.Names}}'

run container (ru) <source-container-name> <deployed-container-name> [<-p host-port:container-port>] :: \
    if [[ $3 == -p ]]; then \
        docker run -d $3 $4 $5 $6 --name $2 $1; \
    else \
        docker -d --name $2 $1; \
    fi

shell (sh) [<-s>] [<-r>] <container_name> :: \
    tmp_shell=bash; tmp_user=""; \
    while [[ "$1" != "" ]]; do \
        case $1 in \
            -s) tmp_shell=sh;; \
            -r) tmp_user="--user root";; \
            *) break;; \
        esac; \
        echo $1; shift; \ 
    done; \
    docker exec -it $tmp_user $1 $tmp_shell \
    !! docker ps --all --format '{{.Names}}' \
    ## bash shell. -s: sh, -r: user root

start container (st) [<-a>] <container_name> :: docker start $1 \
    !! docker ps --all --format '{{.Names}}'

stats (s) :: docker stats ## Show the CPU, Memory consumption of containers

stop container (so) [<-a>] <container_name> :: \
    if [[ $1 == -a ]]; then \
        conts="$(docker ps -q)"; \
        if [[ "$conts" != "" ]]; then \
            docker stop $conts; \
        fi; \
    else \
        docker stop $1; \
    fi \
    !! docker ps --all --format '{{.Names}}' \
    ## -a: Stop all containers

# -------------------------------------------------------------------------------------------------
= COMPOSE
# -------------------------------------------------------------------------------------------------

compose build (cb) :: \
    if [[ "$1" == "" ]]; then \
        docker compose build; \
    else \
        docker compose -f $1 build; \
    fi; \
    ## Build containers

# docker compose build --no-cache --progress=plain

compose down (cdo) [<service>] :: \
    if [[ "$1" == "" ]]; then \
        docker compose down; \
    else \
        docker compose -f $1 down; \
    fi; \
    ## Stop and remove containers, networks

compose list (cls) :: docker compose ls

compose restart (cre) [<service>] :: \
    if [[ "$1" == "" ]]; then \
        docker compose restart; \
    else \
        docker compose -f $1 restart; \
    fi; \
    ## Restart all containers

compose top (ct) :: docker compose top

compose up (cup) [<service>] :: \
    if [[ "$1" == "" ]]; then \
        docker compose up -d; \
    else \
        docker compose -f $1 up -d; \
    fi; \
    ## Deploy and run containers, networks

compose build up (cbup) [<service>] :: \
    if [[ "$1" == "" ]]; then \
        docker compose up -d --build; \
    else \
        docker compose -f $1 up -d --build; \
    fi; \
    ## Build, deploy and run containers, networks

# -------------------------------------------------------------------------------------------------
= NETWORKS
# -------------------------------------------------------------------------------------------------

list networks (ln) :: docker network ls

prune networks (pn) :: docker network prune ## Remove all unused custom networks

remove network (rn) <network-name> :: docker network rm $1 !! docker network ls --format '{{.Name}}'

# -------------------------------------------------------------------------------------------------
= SYSTEM
# -------------------------------------------------------------------------------------------------

system prune all (spa) :: \
    read -p "THIS WILL REMOVE ALL unused containers, images, networks, and build cache (ie containers not created) - Are you sure [yN]? " yn; \
    if [[ ${yn^} == Y ]]; then \
        docker system prune -a; \
    fi \
    ## Remove ALL unused containers, images, networks, and build cache

# -------------------------------------------------------------------------------------------------
= VOLUMES
# -------------------------------------------------------------------------------------------------

volume ls (vls) :: docker volume ls

Alias file

# Completion function
_dc_complete() {
    local cur prev all
    all=""
    for ((i = 1; i < ${#COMP_WORDS[@]}; i++)); do
        word="${COMP_WORDS[i]}"
        [[ $word != -* ]] && all+="$word "
    done
    all="$(echo $all | xargs)"
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev_step=1
    prev="${COMP_WORDS[COMP_CWORD-$prev_step]}"
    while [[ "${prev:0:1}" == "-" ]]; do
        let prev_step=prev_step+1
        prev="${COMP_WORDS[COMP_CWORD-$prev_step]}"
    done

        if [[ "$all" == "delete container" || "$prev" == "drm" || "$prev" == "@drm" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}')" -- "$cur") )
        fi
        if [[ "$all" == "logs" || "$prev" == "dlo" || "$prev" == "@dlo" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}' )" -- "$cur") )
        fi
        if [[ "$all" == "rename container" || "$prev" == "dmv" || "$prev" == "@dmv" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}')" -- "$cur") )
        fi
        if [[ "$all" == "restart container" || "$prev" == "dre" || "$prev" == "@dre" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}')" -- "$cur") )
        fi
        if [[ "$all" == "shell" || "$prev" == "dsh" || "$prev" == "@dsh" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}' )" -- "$cur") )
        fi
        if [[ "$all" == "start container" || "$prev" == "dst" || "$prev" == "@dst" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}')" -- "$cur") )
        fi
        if [[ "$all" == "stop container" || "$prev" == "dso" || "$prev" == "@dso" ]]; then
            COMPREPLY=( $(compgen -W "$(docker ps --all --format '{{.Names}}' )" -- "$cur") )
        fi
        if [[ "$all" == "remove network" || "$prev" == "drn" || "$prev" == "@drn" ]]; then
            COMPREPLY=( $(compgen -W "$(docker network ls --format '{{.Name}}')" -- "$cur") )
        fi
}
complete -F _dc_complete dc @dhe @dli @drm @dps @dlo @der @dpu @dmv @dre @dru @dsh @dst @ds @dso @dcb @dcdo @dcls @dcre @dct @dcup @dcbup @dln @dpn @drn @dspa @dvls

# Shortcut aliases
alias @dhe='dc dhe'
alias @dli='dc dli'
alias @drm='dc drm'
alias @dps='dc dps'
alias @dlo='dc dlo'
alias @der='dc der'
alias @dpu='dc dpu'
alias @dmv='dc dmv'
alias @dre='dc dre'
alias @dru='dc dru'
alias @dsh='dc dsh'
alias @dst='dc dst'
alias @ds='dc ds'
alias @dso='dc dso'
alias @dcb='dc dcb'
alias @dcdo='dc dcdo'
alias @dcls='dc dcls'
alias @dcre='dc dcre'
alias @dct='dc dct'
alias @dcup='dc dcup'
alias @dcbup='dc dcbup'
alias @dln='dc dln'
alias @dpn='dc dpn'
alias @drn='dc drn'
alias @dspa='dc dspa'
alias @dvls='dc dvls'

Bash script

#!/usr/bin/env bash
debug_yn=n
[[ "$1" == "-d" ]] && { debug_yn=y; shift; }
[[ "${CLI_DEBUG^^}" == "TRUE" ]] && debug_yn=y

C_CYA="\x1b[96m" C_GRE="\x1b[92m" C_MAG="\x1b[95m" C_WHI="\x1b[97m" C_DEF="\x1b[0m"

# param 1 - actual number of parameters
# param 2 - required number of parameters
# param 3 - incorrect parameters message
check_params() {
  [[ "$1" < "$2" ]] && { echo -e "$3"; exit; }
}

print_command() {
  [[ $debug_yn == y ]] && { echo "COMMAND: $*" | sed 's/"/\"/g'; echo "COMMAND: $*" | sed 's/./-/g'; }
}
section="HELP"

if [[ "$1" == "help" || "$1" == "dhe" ]]; then
   [[ "$1" == "dhe" ]] && shift || shift 1
   usage="\x1b[95mhelp \x1b[96m(dhe)\x1b[97m\x1b[0m"
   check_params $# 0 "Usage: $usage"

echo -e "\x1b[95mgenerated:2026-06-11 13:33\x1b[0m"
echo

            while IFS= read -r line; do echo -e "${line}${CRESET}"; done < <(egrep "usage=|section=" "$0" | grep -v "grep" | sed "s/.*usage=/   /; s/.*section=/\x1b[92m/; s/\"//g")
   exit
fi
section="IMAGES"

if [[ "$1 $2" == "list images" || "$1" == "dli" ]]; then
   [[ "$1" == "dli" ]] && shift || shift 2
   usage="\x1b[95mlist images \x1b[96m(dli)\x1b[97m [name]\x1b[92m # Use % or * as wildcards\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker images; else filter=\"${1//\*/.\*}\"; filter=\"${filter//%/.\*}\"; docker images 2>/dev/null | egrep \"^$filter .*|IMAGE\"; fi"
   if [[ "$1" == "" ]]; then docker images; else filter="${1//\*/.\*}"; filter="${filter//%/.\*}"; docker images 2>/dev/null | egrep "^$filter .*|IMAGE"; fi
   exit
fi
section="CONTAINERS"

if [[ "$1 $2" == "delete container" || "$1" == "drm" ]]; then
   [[ "$1" == "drm" ]] && shift || shift 2
   usage="\x1b[95mdelete container \x1b[96m(drm)\x1b[97m <container_name>\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " read -p \"Are you sure [yN]? \" yn; if [[ ${yn^} == Y ]]; then docker rm $1; fi"
   read -p "Are you sure [yN]? " yn; if [[ ${yn^} == Y ]]; then docker rm $1; fi
   exit
fi

if [[ "$1 $2" == "list containers" || "$1" == "dps" ]]; then
   [[ "$1" == "dps" ]] && shift || shift 2
   usage="\x1b[95mlist containers \x1b[96m(dps)\x1b[97m [-d]\x1b[92m # -d: show details\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ $1 == -d ]]; then docker ps --all; else tmp=\"$(docker ps --all --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Size}}')\"; echo \"$tmp\" | head -n1; echo \"$tmp\" | tail -n+2 | grep 'Up [0-9]* min' | sort -k2,2; echo \"$tmp\" | tail -n+2 | grep -v 'Up [0-9]* min' | sort -k 2,2; fi"
   if [[ $1 == -d ]]; then docker ps --all; else tmp="$(docker ps --all --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Size}}')"; echo "$tmp" | head -n1; echo "$tmp" | tail -n+2 | grep 'Up [0-9]* min' | sort -k2,2; echo "$tmp" | tail -n+2 | grep -v 'Up [0-9]* min' | sort -k 2,2; fi
   exit
fi

if [[ "$1" == "logs" || "$1" == "dlo" ]]; then
   [[ "$1" == "dlo" ]] && shift || shift 1
   usage="\x1b[95mlogs \x1b[96m(dlo)\x1b[97m [-f] <container-name>\x1b[92m # -f: follow log\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " if [[ $1 == -f ]]; then docker logs -f $2; else docker logs $1; fi"
   if [[ $1 == -f ]]; then docker logs -f $2; else docker logs $1; fi
   exit
fi

if [[ "$1" == "errs" || "$1" == "der" ]]; then
   [[ "$1" == "der" ]] && shift || shift 1
   usage="\x1b[95merrs \x1b[96m(der)\x1b[97m [-f]\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " echo \"\" > /tmp/docker_err_p; while [[ true ]]; do for c in $(docker ps --format '{{.Names}}'); do docker logs $c 2>&1 | grep \"ERROR:\" | sed \"s/^/$c: /\"; done > /tmp/docker_err_c; grep -Fxvf /tmp/docker_err_p /tmp/docker_err_c; mv -f /tmp/docker_err_c /tmp/docker_err_p; if [[ $1 != -f ]]; then break; fi; sleep 2; done"
   echo "" > /tmp/docker_err_p; while [[ true ]]; do for c in $(docker ps --format '{{.Names}}'); do docker logs $c 2>&1 | grep "ERROR:" | sed "s/^/$c: /"; done > /tmp/docker_err_c; grep -Fxvf /tmp/docker_err_p /tmp/docker_err_c; mv -f /tmp/docker_err_c /tmp/docker_err_p; if [[ $1 != -f ]]; then break; fi; sleep 2; done
   exit
fi

if [[ "$1 $2" == "pull container" || "$1" == "dpu" ]]; then
   [[ "$1" == "dpu" ]] && shift || shift 2
   usage="\x1b[95mpull container \x1b[96m(dpu)\x1b[97m <container_name>\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " docker pull $1"
   docker pull $1
   exit
fi

if [[ "$1 $2" == "rename container" || "$1" == "dmv" ]]; then
   [[ "$1" == "dmv" ]] && shift || shift 2
   usage="\x1b[95mrename container \x1b[96m(dmv)\x1b[97m <current_name> <new_name>\x1b[0m"
   check_params $# 2 "Usage: $usage"
   print_command " docker rename $1 $2"
   docker rename $1 $2
   exit
fi

if [[ "$1 $2" == "restart container" || "$1" == "dre" ]]; then
   [[ "$1" == "dre" ]] && shift || shift 2
   usage="\x1b[95mrestart container \x1b[96m(dre)\x1b[97m <container_name>\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " docker restart $1"
   docker restart $1
   exit
fi

if [[ "$1 $2" == "run container" || "$1" == "dru" ]]; then
   [[ "$1" == "dru" ]] && shift || shift 2
   usage="\x1b[95mrun container \x1b[96m(dru)\x1b[97m <source-container-name> <deployed-container-name> [-p host-port:container-port]\x1b[0m"
   check_params $# 2 "Usage: $usage"
   print_command " if [[ $3 == -p ]]; then docker run -d $3 $4 $5 $6 --name $2 $1; else docker -d --name $2 $1; fi"
   if [[ $3 == -p ]]; then docker run -d $3 $4 $5 $6 --name $2 $1; else docker -d --name $2 $1; fi
   exit
fi

if [[ "$1" == "shell" || "$1" == "dsh" ]]; then
   [[ "$1" == "dsh" ]] && shift || shift 1
   usage="\x1b[95mshell \x1b[96m(dsh)\x1b[97m [-s] [-r] <container_name>\x1b[92m # bash shell. -s: sh, -r: user root\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " tmp_shell=bash; tmp_user=\"\"; while [[ \"$1\" != \"\" ]]; do case $1 in -s) tmp_shell=sh;; -r) tmp_user=\"--user root\";; *) break;; esac; echo $1; shift; done; docker exec -it $tmp_user $1 $tmp_shell"
   tmp_shell=bash; tmp_user=""; while [[ "$1" != "" ]]; do case $1 in -s) tmp_shell=sh;; -r) tmp_user="--user root";; *) break;; esac; echo $1; shift; done; docker exec -it $tmp_user $1 $tmp_shell
   exit
fi

if [[ "$1 $2" == "start container" || "$1" == "dst" ]]; then
   [[ "$1" == "dst" ]] && shift || shift 2
   usage="\x1b[95mstart container \x1b[96m(dst)\x1b[97m [-a] <container_name>\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " docker start $1"
   docker start $1
   exit
fi

if [[ "$1" == "stats" || "$1" == "ds" ]]; then
   [[ "$1" == "ds" ]] && shift || shift 1
   usage="\x1b[95mstats \x1b[96m(ds)\x1b[97m\x1b[92m # Show the CPU, Memory consumption of containers\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker stats"
   docker stats
   exit
fi

if [[ "$1 $2" == "stop container" || "$1" == "dso" ]]; then
   [[ "$1" == "dso" ]] && shift || shift 2
   usage="\x1b[95mstop container \x1b[96m(dso)\x1b[97m [-a] <container_name>\x1b[92m # -a: Stop all containers\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " if [[ $1 == -a ]]; then conts=\"$(docker ps -q)\"; if [[ \"$conts\" != \"\" ]]; then docker stop $conts; fi; else docker stop $1; fi"
   if [[ $1 == -a ]]; then conts="$(docker ps -q)"; if [[ "$conts" != "" ]]; then docker stop $conts; fi; else docker stop $1; fi
   exit
fi
section="COMPOSE"

if [[ "$1 $2" == "compose build" || "$1" == "dcb" ]]; then
   [[ "$1" == "dcb" ]] && shift || shift 2
   usage="\x1b[95mcompose build \x1b[96m(dcb)\x1b[97m\x1b[92m # Build containers\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker compose build; else docker compose -f $1 build; fi;"
   if [[ "$1" == "" ]]; then docker compose build; else docker compose -f $1 build; fi;
   exit
fi

if [[ "$1 $2" == "compose down" || "$1" == "dcdo" ]]; then
   [[ "$1" == "dcdo" ]] && shift || shift 2
   usage="\x1b[95mcompose down \x1b[96m(dcdo)\x1b[97m [service]\x1b[92m # Stop and remove containers, networks\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker compose down; else docker compose -f $1 down; fi;"
   if [[ "$1" == "" ]]; then docker compose down; else docker compose -f $1 down; fi;
   exit
fi

if [[ "$1 $2" == "compose list" || "$1" == "dcls" ]]; then
   [[ "$1" == "dcls" ]] && shift || shift 2
   usage="\x1b[95mcompose list \x1b[96m(dcls)\x1b[97m\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker compose ls"
   docker compose ls
   exit
fi

if [[ "$1 $2" == "compose restart" || "$1" == "dcre" ]]; then
   [[ "$1" == "dcre" ]] && shift || shift 2
   usage="\x1b[95mcompose restart \x1b[96m(dcre)\x1b[97m [service]\x1b[92m # Restart all containers\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker compose restart; else docker compose -f $1 restart; fi;"
   if [[ "$1" == "" ]]; then docker compose restart; else docker compose -f $1 restart; fi;
   exit
fi

if [[ "$1 $2" == "compose top" || "$1" == "dct" ]]; then
   [[ "$1" == "dct" ]] && shift || shift 2
   usage="\x1b[95mcompose top \x1b[96m(dct)\x1b[97m\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker compose top"
   docker compose top
   exit
fi

if [[ "$1 $2" == "compose up" || "$1" == "dcup" ]]; then
   [[ "$1" == "dcup" ]] && shift || shift 2
   usage="\x1b[95mcompose up \x1b[96m(dcup)\x1b[97m [service]\x1b[92m # Deploy and run containers, networks\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker compose up -d; else docker compose -f $1 up -d; fi;"
   if [[ "$1" == "" ]]; then docker compose up -d; else docker compose -f $1 up -d; fi;
   exit
fi

if [[ "$1 $2 $3" == "compose build up" || "$1" == "dcbup" ]]; then
   [[ "$1" == "dcbup" ]] && shift || shift 3
   usage="\x1b[95mcompose build up \x1b[96m(dcbup)\x1b[97m [service]\x1b[92m # Build, deploy and run containers, networks\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " if [[ \"$1\" == \"\" ]]; then docker compose up -d --build; else docker compose -f $1 up -d --build; fi;"
   if [[ "$1" == "" ]]; then docker compose up -d --build; else docker compose -f $1 up -d --build; fi;
   exit
fi
section="NETWORKS"

if [[ "$1 $2" == "list networks" || "$1" == "dln" ]]; then
   [[ "$1" == "dln" ]] && shift || shift 2
   usage="\x1b[95mlist networks \x1b[96m(dln)\x1b[97m\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker network ls"
   docker network ls
   exit
fi

if [[ "$1 $2" == "prune networks" || "$1" == "dpn" ]]; then
   [[ "$1" == "dpn" ]] && shift || shift 2
   usage="\x1b[95mprune networks \x1b[96m(dpn)\x1b[97m\x1b[92m # Remove all unused custom networks\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker network prune"
   docker network prune
   exit
fi

if [[ "$1 $2" == "remove network" || "$1" == "drn" ]]; then
   [[ "$1" == "drn" ]] && shift || shift 2
   usage="\x1b[95mremove network \x1b[96m(drn)\x1b[97m <network-name>\x1b[0m"
   check_params $# 1 "Usage: $usage"
   print_command " docker network rm $1"
   docker network rm $1
   exit
fi
section="SYSTEM"

if [[ "$1 $2 $3" == "system prune all" || "$1" == "dspa" ]]; then
   [[ "$1" == "dspa" ]] && shift || shift 3
   usage="\x1b[95msystem prune all \x1b[96m(dspa)\x1b[97m\x1b[92m # Remove ALL unused containers, images, networks, and build cache\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " read -p \"THIS WILL REMOVE ALL unused containers, images, networks, and build cache (ie containers not created) - Are you sure [yN]? \" yn; if [[ ${yn^} == Y ]]; then docker system prune -a; fi"
   read -p "THIS WILL REMOVE ALL unused containers, images, networks, and build cache (ie containers not created) - Are you sure [yN]? " yn; if [[ ${yn^} == Y ]]; then docker system prune -a; fi
   exit
fi
section="VOLUMES"

if [[ "$1 $2" == "volume ls" || "$1" == "dvls" ]]; then
   [[ "$1" == "dvls" ]] && shift || shift 2
   usage="\x1b[95mvolume ls \x1b[96m(dvls)\x1b[97m\x1b[0m"
   check_params $# 0 "Usage: $usage"
   print_command " docker volume ls"
   docker volume ls
   exit
fi

if [[ "$1" == "" ]]; then
  echo "No option passed"
else
  echo "$*: invalid option"
fi
echo "Try "dc help" for more information."