Docker Completions

(in /home/bsgt/stablecaps_bashrc/completions/docker_completion.sh)

Function Index

01 - __docker_q
02 - __docker_configs
03 - __docker_complete_configs
04 - __docker_containers
05 - __docker_complete_containers
06 - __docker_complete_containers_all
07 - __docker_complete_containers_removable
08 - __docker_complete_containers_running
09 - __docker_complete_containers_stoppable
10 - __docker_complete_containers_stopped
11 - __docker_complete_containers_unpauseable
12 - __docker_complete_container_names
13 - __docker_complete_container_ids
14 - __docker_contexts
15 - __docker_complete_contexts

>> __docker_q():

function __docker_q() {
    docker ${host:+--host "$host"} ${config:+--config "$config"} ${context:+--context "$context"} 2>/dev/null "$@"
}


>> __docker_configs():

function  __docker_configs() {
    local format
    if [ "$1" = "--id" ] ; then
        format='{{.ID}}'
        shift
    elif [ "$1" = "--name" ] ; then
        format='{{.Name}}'
        shift
    elif [ "$DOCKER_COMPLETION_SHOW_CONFIG_IDS" = yes ] ; then
        format='{{.ID}} {{.Name}}'
    else
        format='{{.Name}}'
    fi

    __docker_q config ls --format "$format" "$@"
}

Function Calls:
└─ __docker_configs
   └─ __docker_q

>> __docker_complete_configs():

function __docker_complete_configs() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_configs "$@")" -- "$current") )
}

Function Calls:
└─ __docker_complete_configs
   └─ __docker_configs
      └─ __docker_q

>> __docker_containers():

function __docker_containers() {
    local format
    if [ "$1" = "--id" ] ; then
        format='{{.ID}}'
        shift
    elif [ "$1" = "--name" ] ; then
        format='{{.Names}}'
        shift
    elif [ "${DOCKER_COMPLETION_SHOW_CONTAINER_IDS}" = yes ] ; then
        format='{{.ID}} {{.Names}}'
    else
        format='{{.Names}}'
    fi
    __docker_q ps --format "$format" "$@"
}

Function Calls:
└─ __docker_containers
   └─ __docker_q

>> __docker_complete_containers():

function __docker_complete_containers() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_containers "$@")" -- "$current") )
}

Function Calls:
└─ __docker_complete_containers
   └─ __docker_containers
      └─ __docker_q

>> __docker_complete_containers_all():

function __docker_complete_containers_all() {
    __docker_complete_containers "$@" --all
}

Function Calls:
└─ __docker_complete_containers_all
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_containers_removable():

function __docker_complete_containers_removable() {
    __docker_complete_containers "$@" --filter status=created --filter status=exited
}

Function Calls:
└─ __docker_complete_containers_removable
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_containers_running():

function __docker_complete_containers_running() {
    __docker_complete_containers "$@" --filter status=running
}

Function Calls:
└─ __docker_complete_containers_running
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_containers_stoppable():

function __docker_complete_containers_stoppable() {
    __docker_complete_containers "$@" --filter status=running --filter status=paused
}

Function Calls:
└─ __docker_complete_containers_stoppable
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_containers_stopped():

function __docker_complete_containers_stopped() {
    __docker_complete_containers "$@" --filter status=exited
}

Function Calls:
└─ __docker_complete_containers_stopped
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_containers_unpauseable():

function __docker_complete_containers_unpauseable() {
    __docker_complete_containers "$@" --filter status=paused
}

Function Calls:
└─ __docker_complete_containers_unpauseable
   └─ __docker_complete_containers
      └─ __docker_containers

>> __docker_complete_container_names():

function __docker_complete_container_names() {
    local containers=( $(__docker_q ps -aq --no-trunc) )
    local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
    names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
    COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
}

Function Calls:
└─ __docker_complete_container_names
   └─ __docker_q

>> __docker_complete_container_ids():

function __docker_complete_container_ids() {
    local containers=( $(__docker_q ps -aq) )
    COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}

Function Calls:
└─ __docker_complete_container_ids
   └─ __docker_q

>> __docker_contexts():

function __docker_contexts() {
    local add=()
    while true ; do
        case "$1" in
            --add)
                add+=("$2")
                shift 2
                ;;
            *)
                break
                ;;
        esac
    done
    __docker_q context ls -q
    echo "${add[@]}"
}

Function Calls:
└─ __docker_contexts
   └─ __docker_q

>> __docker_complete_contexts():

function __docker_complete_contexts() {
    local contexts=( $(__docker_contexts "$@") )
    COMPREPLY=( $(compgen -W "${contexts[*]}" -- "$cur") )
}


__docker_images() {
    local repo_format='{{.Repository}}'
    local tag_format='{{.Repository}}:{{.Tag}}'
    local id_format='{{.ID}}'
    local all
    local format

    if [ "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" = "all" ] ; then
        all='--all'
    fi

    while true ; do
        case "$1" in
            --repo)
                format+="$repo_format\n"
                shift
                ;;
            --tag)
                if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
                    format+="$tag_format\n"
                fi
                shift
                ;;
            --id)
                if [[ $DOCKER_COMPLETION_SHOW_IMAGE_IDS =~ ^(all|non-intermediate)$ ]] ; then
                    format+="$id_format\n"
                fi
                shift
                ;;
            --force-tag)
                format+="$tag_format\n"
                shift
                ;;
            *)
                break
                ;;
        esac
    done

    __docker_q image ls --no-trunc --format "${format%\\n}" $all "$@" | grep -v '<none>$'
}

__docker_complete_images() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_images "$@")" -- "$current") )
    __ltrim_colon_completions "$current"
}

__docker_networks() {
    local format
    if [ "$1" = "--id" ] ; then
        format='{{.ID}}'
        shift
    elif [ "$1" = "--name" ] ; then
        format='{{.Name}}'
        shift
    elif [ "${DOCKER_COMPLETION_SHOW_NETWORK_IDS}" = yes ] ; then
        format='{{.ID}} {{.Name}}'
    else
        format='{{.Name}}'
    fi
    __docker_q network ls --format "$format" "$@"
}

__docker_complete_networks() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_networks "$@")" -- "$current") )
}

__docker_complete_containers_in_network() {
    local containers=($(__docker_q network inspect -f '{{range $i, $c := .Containers}}{{$i}} {{$c.Name}} {{end}}' "$1"))
    COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}

__docker_volumes() {
    __docker_q volume ls -q "$@"
}

__docker_complete_volumes() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_volumes "$@")" -- "$current") )
}

__docker_plugins_bundled() {
    local type add=() remove=()
    while true ; do
        case "$1" in
            --type)
                type="$2"
                shift 2
                ;;
            --add)
                add+=("$2")
                shift 2
                ;;
            --remove)
                remove+=("$2")
                shift 2
                ;;
            *)
                break
                ;;
        esac
    done

    local plugins=($(__docker_q info --format "{{range \$i, \$p := .Plugins.$type}}{{.}} {{end}}"))
    for del in "${remove[@]}" ; do
        plugins=(${plugins[@]/$del/})
    done
    echo "${plugins[@]}" "${add[@]}"
}

__docker_complete_plugins_bundled() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_plugins_bundled "$@")" -- "$current") )
}

__docker_plugins_installed() {
    local format
    if [ "$DOCKER_COMPLETION_SHOW_PLUGIN_IDS" = yes ] ; then
        format='{{.ID}} {{.Name}}'
    else
        format='{{.Name}}'
    fi
    __docker_q plugin ls --format "$format" "$@"
}

__docker_complete_plugins_installed() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_plugins_installed "$@")" -- "$current") )
}

__docker_runtimes() {
    __docker_q info | sed -n 's/^Runtimes: \(.*\)/\1/p'
}

__docker_complete_runtimes() {
    COMPREPLY=( $(compgen -W "$(__docker_runtimes)" -- "$cur") )
}

__docker_secrets() {
    local format
    if [ "$1" = "--id" ] ; then
        format='{{.ID}}'
        shift
    elif [ "$1" = "--name" ] ; then
        format='{{.Name}}'
        shift
    elif [ "$DOCKER_COMPLETION_SHOW_SECRET_IDS" = yes ] ; then
        format='{{.ID}} {{.Name}}'
    else
        format='{{.Name}}'
    fi

    __docker_q secret ls --format "$format" "$@"
}

__docker_complete_secrets() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_secrets "$@")" -- "$current") )
}

__docker_stacks() {
    __docker_q stack ls | awk 'NR>1 {print $1}'
}

__docker_complete_stacks() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_stacks "$@")" -- "$current") )
}

__docker_nodes() {
    local format
    if [ "$DOCKER_COMPLETION_SHOW_NODE_IDS" = yes ] ; then
        format='{{.ID}} {{.Hostname}}'
    else
        format='{{.Hostname}}'
    fi

    local add=()

    while true ; do
        case "$1" in
            --id)
                format='{{.ID}}'
                shift
                ;;
            --name)
                format='{{.Hostname}}'
                shift
                ;;
            --add)
                add+=("$2")
                shift 2
                ;;
            *)
                break
                ;;
        esac
    done

    echo "$(__docker_q node ls --format "$format" "$@")" "${add[@]}"
}

__docker_complete_nodes() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_nodes "$@")" -- "$current") )
}

__docker_services() {
    local fields='$2'  # default: service name only
    [ "${DOCKER_COMPLETION_SHOW_SERVICE_IDS}" = yes ] && fields='$1,$2' # ID & name

    if [ "$1" = "--id" ] ; then
        fields='$1' # IDs only
        shift
    elif [ "$1" = "--name" ] ; then
        fields='$2' # names only
        shift
    fi
        __docker_q service ls "$@" | awk "NR>1 {print $fields}"
}

__docker_complete_services() {
    local current="$cur"
    if [ "$1" = "--cur" ] ; then
        current="$2"
        shift 2
    fi
    COMPREPLY=( $(compgen -W "$(__docker_services "$@")" -- "$current") )
}

__docker_tasks() {
    __docker_q service ps --format '{{.ID}}' ""
}

__docker_complete_services_and_tasks() {
    COMPREPLY=( $(compgen -W "$(__docker_services "$@") $(__docker_tasks)" -- "$cur") )
}

__docker_append_to_completions() {
    COMPREPLY=( ${COMPREPLY[@]/%/"$1"} )
}

__docker_fetch_info() {
    if [ -z "$info_fetched" ] ; then
        read -r client_experimental server_experimental server_os <<< "$(__docker_q version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}')"
        info_fetched=true
    fi
}

__docker_client_is_experimental() {
    __docker_fetch_info
    [ "$client_experimental" = "true" ]
}

__docker_server_is_experimental() {
    __docker_fetch_info
    [ "$server_experimental" = "true" ]
}

__docker_server_os_is() {
    local expected_os="$1"
    __docker_fetch_info
    [ "$server_os" = "$expected_os" ]
}

__docker_stack_orchestrator_is() {
    case "$1" in
        kubernetes)
            if [ -z "$stack_orchestrator_is_kubernetes" ] ; then
                __docker_q stack ls --help | grep -qe --namespace
                stack_orchestrator_is_kubernetes=$?
            fi
            return $stack_orchestrator_is_kubernetes
            ;;
        swarm)
            if [ -z "$stack_orchestrator_is_swarm" ] ; then
                __docker_q stack deploy --help | grep -qe "with-registry-auth"
                stack_orchestrator_is_swarm=$?
            fi
            return $stack_orchestrator_is_swarm
            ;;
        *)
            return 1
            ;;

    esac
}

__docker_pos_first_nonflag() {
    local argument_flags=$1

    local counter=$((${subcommand_pos:-${command_pos}} + 1))
    while [ "$counter" -le "$cword" ]; do
        if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
            (( counter++ ))
            [ "${words[$counter]}" = "=" ] && (( counter++ ))
        else
            case "${words[$counter]}" in
                -*)
                    ;;
                *)
                    break
                    ;;
            esac
        fi

        while [ "${words[$counter + 1]}" = "=" ] ; do
            counter=$(( counter + 2))
        done

        (( counter++ ))
    done

    echo $counter
}

__docker_map_key_of_current_option() {
    local glob="$1"

    local key glob_pos
    if [ "$cur" = "=" ] ; then        # key= case
        key="$prev"
        glob_pos=$((cword - 2))
    elif [[ $cur == *=* ]] ; then     # key=value case (OSX)
        key=${cur%=*}
        glob_pos=$((cword - 1))
    elif [ "$prev" = "=" ] ; then
        key=${words[$cword - 2]}  # key=value case
        glob_pos=$((cword - 3))
    else
        return
    fi

    [ "${words[$glob_pos]}" = "=" ] && ((glob_pos--))  # --option=key=value syntax

    [[ ${words[$glob_pos]} == @($glob) ]] && echo "$key"
}

__docker_value_of_option() {
    local option_extglob=$(__docker_to_extglob "$1")

    local counter=$((command_pos + 1))
    while [ "$counter" -lt "$cword" ]; do
        case ${words[$counter]} in
            $option_extglob )
                echo "${words[$counter + 1]}"
                break
                ;;
        esac
        (( counter++ ))
    done
}

__docker_to_alternatives() {
    local parts=( $1 )
    local IFS='|'
    echo "${parts[*]}"
}

__docker_to_extglob() {
    local extglob=$( __docker_to_alternatives "$1" )
    echo "@($extglob)"
}

__docker_subcommands() {
    local subcommands="$1"

    local counter=$((command_pos + 1))
    while [ "$counter" -lt "$cword" ]; do
        case "${words[$counter]}" in
            $(__docker_to_extglob "$subcommands") )
                subcommand_pos=$counter
                local subcommand=${words[$counter]}
                local completions_func=_docker_${command}_${subcommand//-/_}
                declare -F "$completions_func" >/dev/null && "$completions_func"
                return 0
                ;;
        esac
        (( counter++ ))
    done
    return 1
}

__docker_nospace() {
    type compopt &>/dev/null && compopt -o nospace
}

__docker_complete_resolved_hostname() {
    command -v host >/dev/null 2>&1 || return
    COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
}

__docker_local_interfaces() {
    command -v ip >/dev/null 2>&1 || return

    local format
    if [ "$1" = "--ip-only" ] ; then
        format='\1'
        shift
    else
         format='\1 \2'
    fi

    ip addr show scope global 2>/dev/null | sed -n "s| \+inet \([0-9.]\+\).* \([^ ]\+\)|$format|p"
}

__docker_complete_local_interfaces() {
    local additional_interface
    if [ "$1" = "--add" ] ; then
        additional_interface="$2"
        shift 2
    fi

    COMPREPLY=( $( compgen -W "$(__docker_local_interfaces "$@") $additional_interface" -- "$cur" ) )
}

__docker_complete_local_ips() {
    __docker_complete_local_interfaces --ip-only
}

__docker_complete_capabilities_addable() {
    COMPREPLY=( $( compgen -W "
        ALL
        AUDIT_CONTROL
        BLOCK_SUSPEND
        DAC_READ_SEARCH
        IPC_LOCK
        IPC_OWNER
        LEASE
        LINUX_IMMUTABLE
        MAC_ADMIN
        MAC_OVERRIDE
        NET_ADMIN
        NET_BROADCAST
        SYS_ADMIN
        SYS_BOOT
        SYSLOG
        SYS_MODULE
        SYS_NICE
        SYS_PACCT
        SYS_PTRACE
        SYS_RAWIO
        SYS_RESOURCE
        SYS_TIME
        SYS_TTY_CONFIG
        WAKE_ALARM
    " -- "$cur" ) )
}

__docker_complete_capabilities_droppable() {
    COMPREPLY=( $( compgen -W "
        ALL
        AUDIT_WRITE
        CHOWN
        DAC_OVERRIDE
        FOWNER
        FSETID
        KILL
        MKNOD
        NET_BIND_SERVICE
        NET_RAW
        SETFCAP
        SETGID
        SETPCAP
        SETUID
        SYS_CHROOT
    " -- "$cur" ) )
}

__docker_complete_detach_keys() {
    case "$prev" in
        --detach-keys)
            case "$cur" in
                *,)
                    COMPREPLY=( $( compgen -W "${cur}ctrl-" -- "$cur" ) )
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "ctrl-" -- "$cur" ) )
                    ;;
            esac

            __docker_nospace
            return
            ;;
    esac
    return 1
}

__docker_complete_isolation() {
    COMPREPLY=( $( compgen -W "default hyperv process" -- "$cur" ) )
}

__docker_complete_log_drivers() {
    COMPREPLY=( $( compgen -W "
        awslogs
        etwlogs
        fluentd
        gcplogs
        gelf
        journald
        json-file
        local
        logentries
        none
        splunk
        syslog
    " -- "$cur" ) )
}

__docker_complete_log_options() {

    local common_options1="max-buffer-size mode"
    local common_options2="env env-regex labels"

    local awslogs_options="$common_options1 awslogs-create-group awslogs-credentials-endpoint awslogs-datetime-format awslogs-group awslogs-multiline-pattern awslogs-region awslogs-stream tag"

    local fluentd_options="$common_options1 $common_options2 fluentd-address fluentd-async-connect fluentd-buffer-limit fluentd-retry-wait fluentd-max-retries fluentd-sub-second-precision tag"
    local gcplogs_options="$common_options1 $common_options2 gcp-log-cmd gcp-meta-id gcp-meta-name gcp-meta-zone gcp-project"
    local gelf_options="$common_options1 $common_options2 gelf-address gelf-compression-level gelf-compression-type gelf-tcp-max-reconnect gelf-tcp-reconnect-delay tag"
    local journald_options="$common_options1 $common_options2 tag"
    local json_file_options="$common_options1 $common_options2 compress max-file max-size"
    local local_options="$common_options1 compress max-file max-size"
    local logentries_options="$common_options1 $common_options2 line-only logentries-token tag"
    local splunk_options="$common_options1 $common_options2 splunk-caname splunk-capath splunk-format splunk-gzip splunk-gzip-level splunk-index splunk-insecureskipverify splunk-source splunk-sourcetype splunk-token splunk-url splunk-verify-connection tag"
    local syslog_options="$common_options1 $common_options2 syslog-address syslog-facility syslog-format syslog-tls-ca-cert syslog-tls-cert syslog-tls-key syslog-tls-skip-verify tag"

    local all_options="$fluentd_options $gcplogs_options $gelf_options $journald_options $logentries_options $json_file_options $syslog_options $splunk_options"

    case $(__docker_value_of_option --log-driver) in
        '')
            COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
            ;;
        awslogs)
            COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
            ;;
        fluentd)
            COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
            ;;
        gcplogs)
            COMPREPLY=( $( compgen -W "$gcplogs_options" -S = -- "$cur" ) )
            ;;
        gelf)
            COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
            ;;
        journald)
            COMPREPLY=( $( compgen -W "$journald_options" -S = -- "$cur" ) )
            ;;
        json-file)
            COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
            ;;
        local)
            COMPREPLY=( $( compgen -W "$local_options" -S = -- "$cur" ) )
            ;;
        logentries)
            COMPREPLY=( $( compgen -W "$logentries_options" -S = -- "$cur" ) )
            ;;
        syslog)
            COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
            ;;
        splunk)
            COMPREPLY=( $( compgen -W "$splunk_options" -S = -- "$cur" ) )
            ;;
        *)
            return
            ;;
    esac

    __docker_nospace
}

__docker_complete_log_driver_options() {
    local key=$(__docker_map_key_of_current_option '--log-opt')
    case "$key" in
        awslogs-create-group)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        awslogs-credentials-endpoint)
            COMPREPLY=( $( compgen -W "/" -- "${cur##*=}" ) )
            __docker_nospace
            return
            ;;
        compress|fluentd-async-connect)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        fluentd-sub-second-precision)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        gelf-address)
            COMPREPLY=( $( compgen -W "tcp udp" -S "://" -- "${cur##*=}" ) )
            __docker_nospace
            return
            ;;
        gelf-compression-level)
            COMPREPLY=( $( compgen -W "1 2 3 4 5 6 7 8 9" -- "${cur##*=}" ) )
            return
            ;;
        gelf-compression-type)
            COMPREPLY=( $( compgen -W "gzip none zlib" -- "${cur##*=}" ) )
            return
            ;;
        line-only)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        mode)
            COMPREPLY=( $( compgen -W "blocking non-blocking" -- "${cur##*=}" ) )
            return
            ;;
        syslog-address)
            COMPREPLY=( $( compgen -W "tcp:// tcp+tls:// udp:// unix://" -- "${cur##*=}" ) )
            __docker_nospace
            __ltrim_colon_completions "${cur}"
            return
            ;;
        syslog-facility)
            COMPREPLY=( $( compgen -W "
                auth
                authpriv
                cron
                daemon
                ftp
                kern
                local0
                local1
                local2
                local3
                local4
                local5
                local6
                local7
                lpr
                mail
                news
                syslog
                user
                uucp
            " -- "${cur##*=}" ) )
            return
            ;;
        syslog-format)
            COMPREPLY=( $( compgen -W "rfc3164 rfc5424 rfc5424micro" -- "${cur##*=}" ) )
            return
            ;;
        syslog-tls-ca-cert|syslog-tls-cert|syslog-tls-key)
            _filedir
            return
            ;;
        syslog-tls-skip-verify)
            COMPREPLY=( $( compgen -W "true" -- "${cur##*=}" ) )
            return
            ;;
        splunk-url)
            COMPREPLY=( $( compgen -W "http:// https://" -- "${cur##*=}" ) )
            __docker_nospace
            __ltrim_colon_completions "${cur}"
            return
            ;;
        splunk-gzip|splunk-insecureskipverify|splunk-verify-connection)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        splunk-format)
            COMPREPLY=( $( compgen -W "inline json raw" -- "${cur##*=}" ) )
            return
            ;;
    esac
    return 1
}

__docker_complete_log_levels() {
    COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
}

__docker_complete_restart() {
    case "$prev" in
        --restart)
            case "$cur" in
                on-failure:*)
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") )
                    ;;
            esac
            return
            ;;
    esac
    return 1
}

__docker_complete_signals() {
    local signals=(
        SIGCONT
        SIGHUP
        SIGINT
        SIGKILL
        SIGQUIT
        SIGSTOP
        SIGTERM
        SIGUSR1
        SIGUSR2
    )
    COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo "$cur" | tr '[:lower:]' '[:upper:]')" ) )
}

__docker_complete_stack_orchestrator_options() {
    case "$prev" in
        --kubeconfig)
            _filedir
            return 0
            ;;
        --namespace)
            return 0
            ;;
        --orchestrator)
            COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur") )
            return 0
            ;;
    esac
    return 1
}

__docker_complete_user_group() {
    if [[ $cur == *:* ]] ; then
        COMPREPLY=( $(compgen -g -- "${cur#*:}") )
    else
        COMPREPLY=( $(compgen -u -S : -- "$cur") )
        __docker_nospace
    fi
}

_docker_docker() {
    local boolean_options="
        $global_boolean_options
        --help
        --version -v
    "

    case "$prev" in
        --config)
            _filedir -d
            return
            ;;
        --context|-c)
            __docker_complete_contexts
            return
            ;;
        --log-level|-l)
            __docker_complete_log_levels
            return
            ;;
        $(__docker_to_extglob "$global_options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "$(__docker_to_extglob "$global_options_with_args")" )
            if [ "$cword" -eq "$counter" ]; then
                __docker_client_is_experimental && commands+=(${experimental_client_commands[*]})
                __docker_server_is_experimental && commands+=(${experimental_server_commands[*]})
                COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
            fi
            ;;
    esac
}

_docker_attach() {
    _docker_container_attach
}

_docker_build() {
    _docker_image_build
}


_docker_builder() {
    local subcommands="
        prune
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_builder_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -S = -W "description id inuse parent private shared type until unused-for" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --keep-storage)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --filter --force -f --help --keep-storage" -- "$cur" ) )
            ;;
    esac
}

_docker_checkpoint() {
    local subcommands="
        create
        ls
        rm
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_checkpoint_create() {
    case "$prev" in
        --checkpoint-dir)
            _filedir -d
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--checkpoint-dir --help --leave-running" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_running
            fi
            ;;
    esac
}

_docker_checkpoint_ls() {
    case "$prev" in
        --checkpoint-dir)
            _filedir -d
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_checkpoint_rm() {
    case "$prev" in
        --checkpoint-dir)
            _filedir -d
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                COMPREPLY=( $( compgen -W "$(__docker_q checkpoint ls "$prev" | sed 1d)" -- "$cur" ) )
            fi
            ;;
    esac
}


_docker_config() {
    local subcommands="
        create
        inspect
        ls
        rm
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_config_create() {
    case "$prev" in
        --label|-l)
            return
            ;;
        --template-driver)
            COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --label -l --template-driver" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--label|-l|--template-driver')
            if [ "$cword" -eq "$((counter + 1))" ]; then
                _filedir
            fi
            ;;
    esac
}

_docker_config_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
            ;;
        *)
            __docker_complete_configs
            ;;
    esac
}

_docker_config_list() {
    _docker_config_ls
}

_docker_config_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        id)
            __docker_complete_configs --cur "${cur##*=}" --id
            return
            ;;
        name)
            __docker_complete_configs --cur "${cur##*=}" --name
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_config_remove() {
    _docker_config_rm
}

_docker_config_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_configs
            ;;
    esac
}


_docker_container() {
    local subcommands="
        attach
        commit
        cp
        create
        diff
        exec
        export
        inspect
        kill
        logs
        ls
        pause
        port
        prune
        rename
        restart
        rm
        run
        start
        stats
        stop
        top
        unpause
        update
        wait
    "
    local aliases="
        list
        ps
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_container_attach() {
    __docker_complete_detach_keys && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--detach-keys --help --no-stdin --sig-proxy=false" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--detach-keys')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_running
            fi
            ;;
    esac
}

_docker_container_commit() {
    case "$prev" in
        --author|-a|--change|-c|--message|-m)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause=false -p=false" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')

            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
                return
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_images --repo --tag
                return
            fi
            ;;
    esac
}

_docker_container_cp() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--archive -a --follow-link -L --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                case "$cur" in
                    *:)
                        return
                        ;;
                    *)
                        _filedir
                        local files=( ${COMPREPLY[@]} )

                        __docker_complete_containers_all
                        COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
                        local containers=( ${COMPREPLY[@]} )

                        COMPREPLY=( $( compgen -W "${files[*]} ${containers[*]}" -- "$cur" ) )
                        if [[ "${COMPREPLY[*]}" = *: ]]; then
                            __docker_nospace
                        fi
                        return
                        ;;
                esac
            fi
            (( counter++ ))

            if [ "$cword" -eq "$counter" ]; then
                if [ -e "$prev" ]; then
                    __docker_complete_containers_all
                    COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
                    __docker_nospace
                else
                    _filedir
                fi
                return
            fi
            ;;
    esac
}

_docker_container_create() {
    _docker_container_run_and_create
}

_docker_container_diff() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_container_exec() {
    __docker_complete_detach_keys && return

    case "$prev" in
        --env|-e)
            COMPREPLY=( $( compgen -e -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --user|-u)
            __docker_complete_user_group
            return
            ;;
        --workdir|-w)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--detach -d --detach-keys --env -e --help --interactive -i --privileged -t --tty -u --user --workdir -w" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_running
            ;;
    esac
}

_docker_container_export() {
    case "$prev" in
        --output|-o)
            _filedir
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_container_inspect() {
    _docker_inspect --type container
}

_docker_container_kill() {
    case "$prev" in
        --signal|-s)
            __docker_complete_signals
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_running
            ;;
    esac
}

_docker_container_logs() {
    case "$prev" in
        --since|--tail|--until)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--details --follow -f --help --since --tail --timestamps -t --until" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--since|--tail|--until')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_container_list() {
    _docker_container_ls
}

_docker_container_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        ancestor)
            __docker_complete_images --cur "${cur##*=}" --repo --tag --id
            return
            ;;
        before)
            __docker_complete_containers_all --cur "${cur##*=}"
            return
            ;;
        expose|publish)
            return
            ;;
        id)
            __docker_complete_containers_all --cur "${cur##*=}" --id
            return
            ;;
        health)
            COMPREPLY=( $( compgen -W "healthy starting none unhealthy" -- "${cur##*=}" ) )
            return
            ;;
        is-task)
            COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
            return
            ;;
        name)
            __docker_complete_containers_all --cur "${cur##*=}" --name
            return
            ;;
        network)
            __docker_complete_networks --cur "${cur##*=}"
            return
            ;;
        since)
            __docker_complete_containers_all --cur "${cur##*=}"
            return
            ;;
        status)
            COMPREPLY=( $( compgen -W "created dead exited paused restarting running removing" -- "${cur##*=}" ) )
            return
            ;;
        volume)
            __docker_complete_volumes --cur "${cur##*=}"
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "ancestor before exited expose health id is-task label name network publish since status volume" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format|--last|-n)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --filter -f --format --help --last -n --latest -l --no-trunc --quiet -q --size -s" -- "$cur" ) )
            ;;
    esac
}

_docker_container_pause() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_running
            ;;
    esac
}

_docker_container_port() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_container_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
            ;;
    esac
}

_docker_container_ps() {
    _docker_container_ls
}

_docker_container_rename() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_container_restart() {
    case "$prev" in
        --time|-t)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_all
            ;;
    esac
}

_docker_container_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
            ;;
        *)
            for arg in "${COMP_WORDS[@]}"; do
                case "$arg" in
                    --force|-f)
                        __docker_complete_containers_all
                        return
                        ;;
                esac
            done
            __docker_complete_containers_removable
            ;;
    esac
}

_docker_container_run() {
    _docker_container_run_and_create
}

_docker_container_run_and_create() {
    local options_with_args="
        --add-host
        --attach -a
        --blkio-weight
        --blkio-weight-device
        --cap-add
        --cap-drop
        --cgroup-parent
        --cidfile
        --cpu-period
        --cpu-quota
        --cpu-rt-period
        --cpu-rt-runtime
        --cpuset-cpus
        --cpus
        --cpuset-mems
        --cpu-shares -c
        --device
        --device-cgroup-rule
        --device-read-bps
        --device-read-iops
        --device-write-bps
        --device-write-iops
        --dns
        --dns-option
        --dns-search
        --domainname
        --entrypoint
        --env -e
        --env-file
        --expose
        --group-add
        --health-cmd
        --health-interval
        --health-retries
        --health-start-period
        --health-timeout
        --hostname -h
        --ip
        --ip6
        --ipc
        --kernel-memory
        --label-file
        --label -l
        --link
        --link-local-ip
        --log-driver
        --log-opt
        --mac-address
        --memory -m
        --memory-swap
        --memory-swappiness
        --memory-reservation
        --mount
        --name
        --network
        --network-alias
        --oom-score-adj
        --pid
        --pids-limit
        --publish -p
        --restart
        --runtime
        --security-opt
        --shm-size
        --stop-signal
        --stop-timeout
        --storage-opt
        --tmpfs
        --sysctl
        --ulimit
        --user -u
        --userns
        --uts
        --volume-driver
        --volumes-from
        --volume -v
        --workdir -w
    "
    __docker_server_os_is windows && options_with_args+="
        --cpu-count
        --cpu-percent
        --io-maxbandwidth
        --io-maxiops
        --isolation
    "
    __docker_server_is_experimental && options_with_args+="
        --platform
    "

    local boolean_options="
        --disable-content-trust=false
        --help
        --init
        --interactive -i
        --no-healthcheck
        --oom-kill-disable
        --privileged
        --publish-all -P
        --read-only
        --tty -t
    "

    if [ "$command" = "run" ] || [ "$subcommand" = "run" ] ; then
        options_with_args="$options_with_args
            --detach-keys
        "
        boolean_options="$boolean_options
            --detach -d
            --rm
            --sig-proxy=false
        "
        __docker_complete_detach_keys && return
    fi

    local all_options="$options_with_args $boolean_options"


    __docker_complete_log_driver_options && return
    __docker_complete_restart && return

    local key=$(__docker_map_key_of_current_option '--security-opt')
    case "$key" in
        label)
            [[ $cur == *: ]] && return
            COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "${cur##*=}") )
            if [ "${COMPREPLY[*]}" != "disable" ] ; then
                __docker_nospace
            fi
            return
            ;;
        seccomp)
            local cur=${cur##*=}
            _filedir
            COMPREPLY+=( $( compgen -W "unconfined" -- "$cur" ) )
            return
            ;;
    esac

    case "$prev" in
        --add-host)
            case "$cur" in
                *:)
                    __docker_complete_resolved_hostname
                    return
                    ;;
            esac
            ;;
        --attach|-a)
            COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
            return
            ;;
        --cap-add)
            __docker_complete_capabilities_addable
            return
            ;;
        --cap-drop)
            __docker_complete_capabilities_droppable
            return
            ;;
        --cidfile|--env-file|--label-file)
            _filedir
            return
            ;;
        --device|--tmpfs|--volume|-v)
            case "$cur" in
                *:*)
                    ;;
                '')
                    COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
                    __docker_nospace
                    ;;
                /*)
                    _filedir
                    __docker_nospace
                    ;;
            esac
            return
            ;;
        --env|-e)
            COMPREPLY=( $( compgen -e -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --ipc)
            case "$cur" in
                *:*)
                    cur="${cur#*:}"
                    __docker_complete_containers_running
                    ;;
                *)
                    COMPREPLY=( $( compgen -W 'none host private shareable container:' -- "$cur" ) )
                    if [ "${COMPREPLY[*]}" = "container:" ]; then
                        __docker_nospace
                    fi
                    ;;
            esac
            return
            ;;
        --isolation)
            if __docker_server_os_is windows ; then
                __docker_complete_isolation
                return
            fi
            ;;
        --link)
            case "$cur" in
                *:*)
                    ;;
                *)
                    __docker_complete_containers_running
                    COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
                    __docker_nospace
                    ;;
            esac
            return
            ;;
        --log-driver)
            __docker_complete_log_drivers
            return
            ;;
        --log-opt)
            __docker_complete_log_options
            return
            ;;
        --network)
            case "$cur" in
                container:*)
                    __docker_complete_containers_all --cur "${cur#*:}"
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
                    if [ "${COMPREPLY[*]}" = "container:" ] ; then
                        __docker_nospace
                    fi
                    ;;
            esac
            return
            ;;
        --pid)
            case "$cur" in
                *:*)
                    __docker_complete_containers_running --cur "${cur#*:}"
                    ;;
                *)
                    COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
                    if [ "${COMPREPLY[*]}" = "container:" ]; then
                        __docker_nospace
                    fi
                    ;;
            esac
            return
            ;;
        --runtime)
            __docker_complete_runtimes
            return
            ;;
        --security-opt)
            COMPREPLY=( $( compgen -W "apparmor= label= no-new-privileges seccomp=" -- "$cur") )
            if [ "${COMPREPLY[*]}" != "no-new-privileges" ] ; then
                __docker_nospace
            fi
            return
            ;;
        --stop-signal)
            __docker_complete_signals
            return
            ;;
        --storage-opt)
            COMPREPLY=( $( compgen -W "size" -S = -- "$cur") )
            __docker_nospace
            return
            ;;
        --user|-u)
            __docker_complete_user_group
            return
            ;;
        --userns)
            COMPREPLY=( $( compgen -W "host" -- "$cur" ) )
            return
            ;;
        --volume-driver)
            __docker_complete_plugins_bundled --type Volume
            return
            ;;
        --volumes-from)
            __docker_complete_containers_all
            return
            ;;
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --repo --tag --id
            fi
            ;;
    esac
}

_docker_container_start() {
    __docker_complete_detach_keys && return
    case "$prev" in
        --checkpoint)
            if __docker_server_is_experimental ; then
                return
            fi
            ;;
        --checkpoint-dir)
            if __docker_server_is_experimental ; then
                _filedir -d
                return
            fi
            ;;
    esac

    case "$cur" in
        -*)
            local options="--attach -a --detach-keys --help --interactive -i"
            __docker_server_is_experimental && options+=" --checkpoint --checkpoint-dir"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_stopped
            ;;
    esac
}

_docker_container_stats() {
    case "$prev" in
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --format --help --no-stream --no-trunc" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_running
            ;;
    esac
}

_docker_container_stop() {
    case "$prev" in
        --time|-t)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_stoppable
            ;;
    esac
}

_docker_container_top() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_running
            fi
            ;;
    esac
}

_docker_container_unpause() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_containers_unpauseable
            fi
            ;;
    esac
}

_docker_container_update() {
    local options_with_args="
        --blkio-weight
        --cpu-period
        --cpu-quota
        --cpu-rt-period
        --cpu-rt-runtime
        --cpus
        --cpuset-cpus
        --cpuset-mems
        --cpu-shares -c
        --kernel-memory
        --memory -m
        --memory-reservation
        --memory-swap
        --pids-limit
        --restart
    "

    local boolean_options="
        --help
    "

    local all_options="$options_with_args $boolean_options"

    __docker_complete_restart && return

    case "$prev" in
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_all
            ;;
    esac
}

_docker_container_wait() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_containers_all
            ;;
    esac
}


_docker_context() {
    local subcommands="
        create
        export
        import
        inspect
        ls
        rm
        update
        use
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_context_create() {
    case "$prev" in
        --default-stack-orchestrator)
            COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
            return
            ;;
        --description|--docker|--kubernetes)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --help --kubernetes" -- "$cur" ) )
            ;;
    esac
}

_docker_context_export() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --kubeconfig" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_contexts
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                _filedir
            fi
            ;;
    esac
}

_docker_context_import() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                :
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                _filedir
            fi
            ;;
    esac
}

_docker_context_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_contexts
            ;;
    esac
}

_docker_context_list() {
    _docker_context_ls
}

_docker_context_ls() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_context_remove() {
    _docker_context_rm
}

_docker_context_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_contexts
            ;;
    esac
}

_docker_context_update() {
    case "$prev" in
        --default-stack-orchestrator)
            COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
            return
            ;;
        --description|--docker|--kubernetes)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --help --kubernetes" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_contexts
            fi
            ;;
    esac
}

_docker_context_use() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_contexts --add default
            fi
            ;;
    esac
}


_docker_commit() {
    _docker_container_commit
}

_docker_cp() {
    _docker_container_cp
}

_docker_create() {
    _docker_container_create
}

_docker_daemon() {
    local boolean_options="
        $global_boolean_options
        --experimental
        --help
        --icc=false
        --init
        --ip-forward=false
        --ip-masq=false
        --iptables=false
        --ipv6
        --live-restore
        --no-new-privileges
        --raw-logs
        --selinux-enabled
        --userland-proxy=false
        --version -v
    "
    local options_with_args="
        $global_options_with_args
        --add-runtime
        --allow-nondistributable-artifacts
        --api-cors-header
        --authorization-plugin
        --bip
        --bridge -b
        --cgroup-parent
        --cluster-advertise
        --cluster-store
        --cluster-store-opt
        --config-file
        --containerd
        --cpu-rt-period
        --cpu-rt-runtime
        --data-root
        --default-address-pool
        --default-gateway
        --default-gateway-v6
        --default-runtime
        --default-shm-size
        --default-ulimit
        --dns
        --dns-search
        --dns-opt
        --exec-opt
        --exec-root
        --fixed-cidr
        --fixed-cidr-v6
        --group -G
        --init-path
        --insecure-registry
        --ip
        --label
        --log-driver
        --log-opt
        --max-concurrent-downloads
        --max-concurrent-uploads
        --metrics-addr
        --mtu
        --network-control-plane-mtu
        --node-generic-resource
        --oom-score-adjust
        --pidfile -p
        --registry-mirror
        --seccomp-profile
        --shutdown-timeout
        --storage-driver -s
        --storage-opt
        --swarm-default-advertise-addr
        --userland-proxy-path
        --userns-remap
    "

    __docker_complete_log_driver_options && return

    key=$(__docker_map_key_of_current_option '--cluster-store-opt')
    case "$key" in
        kv.*file)
            cur=${cur##*=}
            _filedir
            return
            ;;
    esac

    local key=$(__docker_map_key_of_current_option '--storage-opt')
    case "$key" in
        dm.blkdiscard|dm.override_udev_sync_check|dm.use_deferred_removal|dm.use_deferred_deletion)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        dm.directlvm_device|dm.thinpooldev)
            cur=${cur##*=}
            _filedir
            return
            ;;
        dm.fs)
            COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur##*=}" ) )
            return
            ;;
        dm.libdm_log_level)
            COMPREPLY=( $( compgen -W "2 3 4 5 6 7" -- "${cur##*=}" ) )
            return
            ;;
    esac

    case "$prev" in
        --authorization-plugin)
            __docker_complete_plugins_bundled --type Authorization
            return
            ;;
        --cluster-store)
            COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --cluster-store-opt)
            COMPREPLY=( $( compgen -W "discovery.heartbeat discovery.ttl kv.cacertfile kv.certfile kv.keyfile kv.path" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --config-file|--containerd|--init-path|--pidfile|-p|--tlscacert|--tlscert|--tlskey|--userland-proxy-path)
            _filedir
            return
            ;;
        --exec-root|--data-root)
            _filedir -d
            return
            ;;
        --log-driver)
            __docker_complete_log_drivers
            return
            ;;
        --storage-driver|-s)
            COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay overlay2 vfs zfs" -- "$(echo "$cur" | tr '[:upper:]' '[:lower:]')" ) )
            return
            ;;
        --storage-opt)
            local btrfs_options="btrfs.min_space"
            local devicemapper_options="
                dm.basesize
                dm.blkdiscard
                dm.blocksize
                dm.directlvm_device
                dm.fs
                dm.libdm_log_level
                dm.loopdatasize
                dm.loopmetadatasize
                dm.min_free_space
                dm.mkfsarg
                dm.mountopt
                dm.override_udev_sync_check
                dm.thinpooldev
                dm.thinp_autoextend_percent
                dm.thinp_autoextend_threshold
                dm.thinp_metapercent
                dm.thinp_percent
                dm.use_deferred_deletion
                dm.use_deferred_removal
            "
            local overlay2_options="overlay2.size"
            local zfs_options="zfs.fsname"

            local all_options="$btrfs_options $devicemapper_options $overlay2_options $zfs_options"

            case $(__docker_value_of_option '--storage-driver|-s') in
                '')
                    COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
                    ;;
                btrfs)
                    COMPREPLY=( $( compgen -W "$btrfs_options" -S = -- "$cur" ) )
                    ;;
                devicemapper)
                    COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) )
                    ;;
                overlay2)
                    COMPREPLY=( $( compgen -W "$overlay2_options" -S = -- "$cur" ) )
                    ;;
                zfs)
                    COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
                    ;;
                *)
                    return
                    ;;
            esac
            __docker_nospace
            return
            ;;
        --log-level|-l)
            __docker_complete_log_levels
            return
            ;;
        --log-opt)
            __docker_complete_log_options
            return
            ;;
        --metrics-addr)
            __docker_complete_local_ips
            __docker_append_to_completions ":"
            __docker_nospace
            return
            ;;
        --seccomp-profile)
            _filedir json
            return
            ;;
        --swarm-default-advertise-addr)
            __docker_complete_local_interfaces
            return
            ;;
        --userns-remap)
            __docker_complete_user_group
            return
            ;;
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
            ;;
    esac
}

_docker_deploy() {
    __docker_server_is_experimental && _docker_stack_deploy
}

_docker_diff() {
    _docker_container_diff
}


_docker_engine() {
    local subcommands="
        activate
        check
        update
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_engine_activate() {
    case "$prev" in
        --containerd|--engine-image|--format|--license|--registry-prefix|--version)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--containerd --display-only --engine-image --format --help --license --quiet --registry-prefix --version" -- "$cur" ) )
            ;;
    esac
}

_docker_engine_check() {
    case "$prev" in
        --containerd|--engine-image|--format|--registry-prefix)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--containerd --downgrades --engine-image --format --help --pre-releases --quiet -q --registry-prefix --upgrades" -- "$cur" ) )
            ;;
    esac
}

_docker_engine_update() {
    case "$prev" in
        --containerd|--engine-image|--registry-prefix|--version)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--containerd --engine-image --help --registry-prefix --version" -- "$cur" ) )
            ;;
    esac
}


_docker_events() {
    _docker_system_events
}

_docker_exec() {
    _docker_container_exec
}

_docker_export() {
    _docker_container_export
}

_docker_help() {
    local counter=$(__docker_pos_first_nonflag)
    if [ "$cword" -eq "$counter" ]; then
        COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
    fi
}

_docker_history() {
    _docker_image_history
}


_docker_image() {
    local subcommands="
        build
        history
        import
        inspect
        load
        ls
        prune
        pull
        push
        rm
        save
        tag
    "
    local aliases="
        images
        list
        remove
        rmi
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_image_build() {
    local options_with_args="
        --add-host
        --build-arg
        --cache-from
        --cgroup-parent
        --cpuset-cpus
        --cpuset-mems
        --cpu-shares -c
        --cpu-period
        --cpu-quota
        --file -f
        --iidfile
        --label
        --memory -m
        --memory-swap
        --network
        --shm-size
        --tag -t
        --target
        --ulimit
    "
    __docker_server_os_is windows && options_with_args+="
        --isolation
    "

    local boolean_options="
        --compress
        --disable-content-trust=false
        --force-rm
        --help
        --no-cache
        --pull
        --quiet -q
        --rm
    "
    if __docker_server_is_experimental ; then
        options_with_args+="
            --platform
        "
        boolean_options+="
            --squash
            --stream
        "
    fi

    local all_options="$options_with_args $boolean_options"

    case "$prev" in
        --add-host)
            case "$cur" in
                *:)
                    __docker_complete_resolved_hostname
                    return
                    ;;
            esac
            ;;
        --build-arg)
            COMPREPLY=( $( compgen -e -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --cache-from)
            __docker_complete_images --repo --tag --id
            return
            ;;
        --file|-f|--iidfile)
            _filedir
            return
            ;;
        --isolation)
            if __docker_server_os_is windows ; then
                __docker_complete_isolation
                return
            fi
            ;;
        --network)
            case "$cur" in
                container:*)
                    __docker_complete_containers_all --cur "${cur#*:}"
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
                    if [ "${COMPREPLY[*]}" = "container:" ] ; then
                        __docker_nospace
                    fi
                    ;;
            esac
            return
            ;;
        --tag|-t)
            __docker_complete_images --repo --tag
            return
            ;;
        --target)
            local context_pos=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
            local context="${words[$context_pos]}"
            context="${context:-.}"

            local file="$( __docker_value_of_option '--file|f' )"
            local default_file="${context%/}/Dockerfile"
            local dockerfile="${file:-$default_file}"

            local targets="$( sed -n 's/^FROM .\+ AS \(.\+\)/\1/p' "$dockerfile" 2>/dev/null )"
            COMPREPLY=( $( compgen -W "$targets" -- "$cur" ) )
            return
            ;;
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
            if [ "$cword" -eq "$counter" ]; then
                _filedir -d
            fi
            ;;
    esac
}

_docker_image_history() {
    case "$prev" in
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format --help --human=false -H=false --no-trunc --quiet -q" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--format')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --force-tag --id
            fi
            ;;
    esac
}

_docker_image_images() {
    _docker_image_ls
}

_docker_image_import() {
    case "$prev" in
        --change|-c|--message|-m|--platform)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--change -c --help --message -m"
            __docker_server_is_experimental && options+=" --platform"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m')
            if [ "$cword" -eq "$counter" ]; then
                _filedir
                return
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_images --repo --tag
                return
            fi
            ;;
    esac
}

_docker_image_inspect() {
    _docker_inspect --type image
}

_docker_image_load() {
    case "$prev" in
        --input|-i|"<")
            _filedir
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --input -i --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_image_list() {
    _docker_image_ls
}

_docker_image_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        before|since)
            __docker_complete_images --cur "${cur##*=}" --force-tag --id
            return
            ;;
        dangling)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        label)
            return
            ;;
        reference)
            __docker_complete_images --cur "${cur##*=}" --repo --tag
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "before dangling label reference since" -- "$cur" ) )
            __docker_nospace
            return
            ;;
                --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
            ;;
        =)
            return
            ;;
        *)
            __docker_complete_images --repo --tag
            ;;
    esac
}

_docker_image_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help" -- "$cur" ) )
            ;;
    esac
}

_docker_image_pull() {
    case "$prev" in
        --platform)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--all-tags -a --disable-content-trust=false --help --quiet -q"
            __docker_server_is_experimental && options+=" --platform"

            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag --platform)
            if [ "$cword" -eq "$counter" ]; then
                for arg in "${COMP_WORDS[@]}"; do
                    case "$arg" in
                        --all-tags|-a)
                            __docker_complete_images --repo
                            return
                            ;;
                    esac
                done
                __docker_complete_images --repo --tag
            fi
            ;;
    esac
}

_docker_image_push() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--disable-content-trust=false --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --repo --tag
            fi
            ;;
    esac
}

_docker_image_remove() {
    _docker_image_rm
}

_docker_image_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
            ;;
        *)
            __docker_complete_images --force-tag --id
            ;;
    esac
}

_docker_image_rmi() {
    _docker_image_rm
}

_docker_image_save() {
    case "$prev" in
        --output|-o|">")
            _filedir
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
            ;;
        *)
            __docker_complete_images --repo --tag --id
            ;;
    esac
}

_docker_image_tag() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)

            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --force-tag --id
                return
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_images --repo --tag
                return
            fi
            ;;
    esac
}


_docker_images() {
    _docker_image_ls
}

_docker_import() {
    _docker_image_import
}

_docker_info() {
    _docker_system_info
}

_docker_inspect() {
    local preselected_type
    local type

    if [ "$1" = "--type" ] ; then
        preselected_type=yes
        type="$2"
    else
        type=$(__docker_value_of_option --type)
    fi

    case "$prev" in
        --format|-f)
            return
            ;;
        --type)
            if [ -z "$preselected_type" ] ; then
                COMPREPLY=( $( compgen -W "container image network node plugin secret service volume" -- "$cur" ) )
                return
            fi
            ;;
    esac

    case "$cur" in
        -*)
            local options="--format -f --help --size -s"
            if [ -z "$preselected_type" ] ; then
                options+=" --type"
            fi
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            case "$type" in
                '')
                    COMPREPLY=( $( compgen -W "
                        $(__docker_containers --all)
                        $(__docker_images --force-tag --id)
                        $(__docker_networks)
                        $(__docker_nodes)
                        $(__docker_plugins_installed)
                        $(__docker_secrets)
                        $(__docker_services)
                        $(__docker_volumes)
                    " -- "$cur" ) )
                    __ltrim_colon_completions "$cur"
                    ;;
                container)
                    __docker_complete_containers_all
                    ;;
                image)
                    __docker_complete_images --force-tag --id
                    ;;
                network)
                    __docker_complete_networks
                    ;;
                node)
                    __docker_complete_nodes
                    ;;
                plugin)
                    __docker_complete_plugins_installed
                    ;;
                secret)
                    __docker_complete_secrets
                    ;;
                service)
                    __docker_complete_services
                    ;;
                volume)
                    __docker_complete_volumes
                    ;;
            esac
    esac
}

_docker_kill() {
    _docker_container_kill
}

_docker_load() {
    _docker_image_load
}

_docker_login() {
    case "$prev" in
        --password|-p|--username|-u)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --password -p --password-stdin --username -u" -- "$cur" ) )
            ;;
    esac
}

_docker_logout() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
    esac
}

_docker_logs() {
    _docker_container_logs
}

_docker_network_connect() {
    local options_with_args="
        --alias
        --ip
        --ip6
        --link
        --link-local-ip
    "

    local boolean_options="
        --help
    "

    case "$prev" in
        --link)
            case "$cur" in
                *:*)
                    ;;
                *)
                    __docker_complete_containers_running
                    COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
                    __docker_nospace
                    ;;
            esac
            return
            ;;
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_networks
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_containers_all
            fi
            ;;
    esac
}

_docker_network_create() {
    case "$prev" in
        --aux-address|--gateway|--ip-range|--ipam-opt|--ipv6|--opt|-o|--subnet)
            return
            ;;
        --config-from)
            __docker_complete_networks
            return
            ;;
        --driver|-d)
            __docker_complete_plugins_bundled --type Network --remove host --remove null --add macvlan
            return
            ;;
        --ipam-driver)
            COMPREPLY=( $( compgen -W "default" -- "$cur" ) )
            return
            ;;
        --label)
            return
            ;;
        --scope)
            COMPREPLY=( $( compgen -W "local swarm" -- "$cur" ) )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--attachable --aux-address --config-from --config-only --driver -d --gateway --help --ingress --internal --ip-range --ipam-driver --ipam-opt --ipv6 --label --opt -o --scope --subnet" -- "$cur" ) )
            ;;
    esac
}

_docker_network_disconnect() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_networks
            elif [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_containers_in_network "$prev"
            fi
            ;;
    esac
}

_docker_network_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --verbose" -- "$cur" ) )
            ;;
        *)
            __docker_complete_networks
    esac
}

_docker_network_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        dangling)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        driver)
            __docker_complete_plugins_bundled --cur "${cur##*=}" --type Network --add macvlan
            return
            ;;
        id)
            __docker_complete_networks --cur "${cur##*=}" --id
            return
            ;;
        name)
            __docker_complete_networks --cur "${cur##*=}" --name
            return
            ;;
        scope)
            COMPREPLY=( $( compgen -W "global local swarm" -- "${cur##*=}" ) )
            return
            ;;
        type)
            COMPREPLY=( $( compgen -W "builtin custom" -- "${cur##*=}" ) )
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "dangling driver id label name scope type" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_network_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
            ;;
    esac
}

_docker_network_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_networks --filter type=custom
    esac
}

_docker_network() {
    local subcommands="
        connect
        create
        disconnect
        inspect
        ls
        prune
        rm
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_service() {
    local subcommands="
        create
        inspect
        logs
        ls
        rm
        rollback
        scale
        ps
        update
    "

    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_service_create() {
    _docker_service_update_and_create
}

_docker_service_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
            ;;
        *)
            __docker_complete_services
    esac
}

_docker_service_logs() {
    case "$prev" in
        --since|--tail)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--details --follow -f --help --no-resolve --no-task-ids --no-trunc --raw --since --tail --timestamps -t" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--since|--tail')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_services_and_tasks
            fi
            ;;
    esac
}

_docker_service_list() {
    _docker_service_ls
}

_docker_service_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        id)
            __docker_complete_services --cur "${cur##*=}" --id
            return
            ;;
        mode)
            COMPREPLY=( $( compgen -W "global replicated" -- "${cur##*=}" ) )
            return
            ;;
        name)
            __docker_complete_services --cur "${cur##*=}" --name
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -W "id label mode name" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_service_remove() {
    _docker_service_rm
}

_docker_service_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_services
    esac
}

_docker_service_rollback() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--detach -d --help --quit -q" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag )
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_services
            fi
            ;;
    esac
}

_docker_service_scale() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--detach -d --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_services
            __docker_append_to_completions "="
            __docker_nospace
            ;;
    esac
}

_docker_service_ps() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        desired-state)
            COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
            return
            ;;
        name)
            __docker_complete_services --cur "${cur##*=}" --name
            return
            ;;
        node)
            __docker_complete_nodes --cur "${cur##*=}" --add self
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -W "desired-state id name node" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
            ;;
        *)
            __docker_complete_services
            ;;
    esac
}

_docker_service_update() {
    _docker_service_update_and_create
}

_docker_service_update_and_create() {
    local options_with_args="
        --endpoint-mode
        --entrypoint
        --health-cmd
        --health-interval
        --health-retries
        --health-start-period
        --health-timeout
        --hostname
        --isolation
        --limit-cpu
        --limit-memory
        --log-driver
        --log-opt
        --replicas
        --replicas-max-per-node
        --reserve-cpu
        --reserve-memory
        --restart-condition
        --restart-delay
        --restart-max-attempts
        --restart-window
        --rollback-delay
        --rollback-failure-action
        --rollback-max-failure-ratio
        --rollback-monitor
        --rollback-order
        --rollback-parallelism
        --stop-grace-period
        --stop-signal
        --update-delay
        --update-failure-action
        --update-max-failure-ratio
        --update-monitor
        --update-order
        --update-parallelism
        --user -u
        --workdir -w
    "
    __docker_server_os_is windows && options_with_args+="
        --credential-spec
    "

    local boolean_options="
        --detach -d
        --help
        --init
        --no-healthcheck
        --no-resolve-image
        --read-only
        --tty -t
        --with-registry-auth
    "

    __docker_complete_log_driver_options && return

    if [ "$subcommand" = "create" ] ; then
        options_with_args="$options_with_args
            --config
            --constraint
            --container-label
            --dns
            --dns-option
            --dns-search
            --env -e
            --env-file
            --generic-resource
            --group
            --host
            --label -l
            --mode
            --mount
            --name
            --network
            --placement-pref
            --publish -p
            --secret
            --sysctl
        "

        case "$prev" in
            --env-file)
                _filedir
                return
                ;;
            --mode)
                COMPREPLY=( $( compgen -W "global replicated" -- "$cur" ) )
                return
                ;;
        esac
    fi
    if [ "$subcommand" = "update" ] ; then
        options_with_args="$options_with_args
            --args
            --config-add
            --config-rm
            --constraint-add
            --constraint-rm
            --container-label-add
            --container-label-rm
            --dns-add
            --dns-option-add
            --dns-option-rm
            --dns-rm
            --dns-search-add
            --dns-search-rm
            --env-add
            --env-rm
            --generic-resource-add
            --generic-resource-rm
            --group-add
            --group-rm
            --host-add
            --host-rm
            --image
            --label-add
            --label-rm
            --mount-add
            --mount-rm
            --network-add
            --network-rm
            --placement-pref-add
            --placement-pref-rm
            --publish-add
            --publish-rm
            --rollback
            --secret-add
            --secret-rm
            --sysctl-add
            --sysctl-rm
        "

        boolean_options="$boolean_options
            --force
        "

        case "$prev" in
            --env-rm)
                COMPREPLY=( $( compgen -e -- "$cur" ) )
                return
                ;;
            --image)
                __docker_complete_images --repo --tag --id
                return
                ;;
        esac
    fi

    local strategy=$(__docker_map_key_of_current_option '--placement-pref|--placement-pref-add|--placement-pref-rm')
    case "$strategy" in
        spread)
            COMPREPLY=( $( compgen -W "engine.labels node.labels" -S . -- "${cur##*=}" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$prev" in
        --config|--config-add|--config-rm)
            __docker_complete_configs
            return
            ;;
        --endpoint-mode)
            COMPREPLY=( $( compgen -W "dnsrr vip" -- "$cur" ) )
            return
            ;;
        --env|-e|--env-add)
            COMPREPLY=( $( compgen -e -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --group|--group-add|--group-rm)
            COMPREPLY=( $(compgen -g -- "$cur") )
            return
            ;;
        --host|--host-add|--host-rm)
            case "$cur" in
                *:)
                    __docker_complete_resolved_hostname
                    return
                    ;;
            esac
            ;;
        --isolation)
            __docker_complete_isolation
            return
            ;;
        --log-driver)
            __docker_complete_log_drivers
            return
            ;;
        --log-opt)
            __docker_complete_log_options
            return
            ;;
        --network|--network-add|--network-rm)
            __docker_complete_networks
            return
            ;;
        --placement-pref|--placement-pref-add|--placement-pref-rm)
            COMPREPLY=( $( compgen -W "spread" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --restart-condition)
            COMPREPLY=( $( compgen -W "any none on-failure" -- "$cur" ) )
            return
            ;;
        --rollback-failure-action)
            COMPREPLY=( $( compgen -W "continue pause" -- "$cur" ) )
            return
            ;;
        --secret|--secret-add|--secret-rm)
            __docker_complete_secrets
            return
            ;;
        --stop-signal)
            __docker_complete_signals
            return
            ;;
        --update-failure-action)
            COMPREPLY=( $( compgen -W "continue pause rollback" -- "$cur" ) )
            return
            ;;
        --update-order|--rollback-order)
            COMPREPLY=( $( compgen -W "start-first stop-first" -- "$cur" ) )
            return
            ;;
        --user|-u)
            __docker_complete_user_group
            return
            ;;
        $(__docker_to_extglob "$options_with_args") )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
            if [ "$subcommand" = "update" ] ; then
                if [ "$cword" -eq "$counter" ]; then
                    __docker_complete_services
                fi
            else
                if [ "$cword" -eq "$counter" ]; then
                    __docker_complete_images --repo --tag --id
                fi
            fi
            ;;
    esac
}

_docker_swarm() {
    local subcommands="
        ca
        init
        join
        join-token
        leave
        unlock
        unlock-key
        update
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_ca() {
    case "$prev" in
        --ca-cert|--ca-key)
            _filedir
            return
            ;;
        --cert-expiry|--external-ca)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--ca-cert --ca-key --cert-expiry --detach -d --external-ca --help --quiet -q --rotate" -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_init() {
    case "$prev" in
        --advertise-addr)
            if [[ $cur == *: ]] ; then
                COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
            else
                __docker_complete_local_interfaces
                __docker_nospace
            fi
            return
            ;;
        --availability)
            COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
            return
            ;;
        --cert-expiry|--data-path-port|--default-addr-pool|--default-addr-pool-mask-length|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit )
            return
            ;;
        --data-path-addr)
            __docker_complete_local_interfaces
            return
            ;;
        --listen-addr)
            if [[ $cur == *: ]] ; then
                COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
            else
                __docker_complete_local_interfaces --add 0.0.0.0
                __docker_nospace
            fi
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--advertise-addr --autolock --availability --cert-expiry --data-path-addr --data-path-port --default-addr-pool --default-addr-pool-mask-length --dispatcher-heartbeat --external-ca --force-new-cluster --help --listen-addr --max-snapshots --snapshot-interval --task-history-limit " -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_join() {
    case "$prev" in
        --advertise-addr)
            if [[ $cur == *: ]] ; then
                COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
            else
                __docker_complete_local_interfaces
                __docker_nospace
            fi
            return
            ;;
        --availability)
            COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
            return
            ;;
        --data-path-addr)
            __docker_complete_local_interfaces
            return
            ;;
        --listen-addr)
            if [[ $cur == *: ]] ; then
                COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
            else
                __docker_complete_local_interfaces --add 0.0.0.0
                __docker_nospace
            fi
            return
            ;;
        --token)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--advertise-addr --availability --data-path-addr --help --listen-addr --token" -- "$cur" ) )
            ;;
        *:)
            COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
            ;;
    esac
}

_docker_swarm_join_token() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag )
            if [ "$cword" -eq "$counter" ]; then
                COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
            fi
            ;;
    esac
}

_docker_swarm_leave() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_unlock() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_unlock_key() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
            ;;
    esac
}

_docker_swarm_update() {
    case "$prev" in
        --cert-expiry|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--autolock --cert-expiry --dispatcher-heartbeat --external-ca --help --max-snapshots --snapshot-interval --task-history-limit" -- "$cur" ) )
            ;;
    esac
}

_docker_manifest() {
    local subcommands="
        annotate
        create
        inspect
        push
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_manifest_annotate() {
    case "$prev" in
        --arch)
            COMPREPLY=( $( compgen -W "
                386
                amd64
                arm
                arm64
                mips64
                mips64le
                ppc64le
                s390x" -- "$cur" ) )
            return
            ;;
        --os)
            COMPREPLY=( $( compgen -W "
                darwin
                dragonfly
                freebsd
                linux
                netbsd
                openbsd
                plan9
                solaris
                windows" -- "$cur" ) )
            return
            ;;
        --os-features|--variant)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--arch --help --os --os-features --variant" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag "--arch|--os|--os-features|--variant" )
            if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_images --force-tag --id
            fi
            ;;
    esac
}

_docker_manifest_create() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--amend -a --help --insecure" -- "$cur" ) )
            ;;
        *)
            __docker_complete_images --force-tag --id
            ;;
    esac
}

_docker_manifest_inspect() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --insecure --verbose -v" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag )
            if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
                __docker_complete_images --force-tag --id
            fi
            ;;
    esac
}

_docker_manifest_push() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --insecure --purge -p" -- "$cur" ) )
            ;;
        *)
            local counter=$( __docker_pos_first_nonflag )
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --force-tag --id
            fi
            ;;
    esac
}

_docker_node() {
    local subcommands="
        demote
        inspect
        ls
        promote
        rm
        ps
        update
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_node_demote() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_nodes --filter role=manager
    esac
}

_docker_node_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
            ;;
        *)
            __docker_complete_nodes --add self
    esac
}

_docker_node_list() {
    _docker_node_ls
}

_docker_node_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        id)
            __docker_complete_nodes --cur "${cur##*=}" --id
            return
            ;;
        membership)
            COMPREPLY=( $( compgen -W "accepted pending" -- "${cur##*=}" ) )
            return
            ;;
        name)
            __docker_complete_nodes --cur "${cur##*=}" --name
            return
            ;;
        role)
            COMPREPLY=( $( compgen -W "manager worker" -- "${cur##*=}" ) )
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -W "id label membership name role" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_node_promote() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_nodes --filter role=worker
    esac
}

_docker_node_remove() {
    _docker_node_rm
}

_docker_node_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_nodes
    esac
}

_docker_node_ps() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        desired-state)
            COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
            return
            ;;
        name)
            __docker_complete_services --cur "${cur##*=}" --name
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -W "desired-state id label name" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
            ;;
        *)
            __docker_complete_nodes --add self
            ;;
    esac
}

_docker_node_update() {
    case "$prev" in
        --availability)
            COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
            return
            ;;
        --role)
            COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
            return
            ;;
        --label-add|--label-rm)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--availability --help --label-add --label-rm --role" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--availability|--label-add|--label-rm|--role')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_nodes
            fi
            ;;
    esac
}

_docker_pause() {
    _docker_container_pause
}

_docker_plugin() {
    local subcommands="
        create
        disable
        enable
        inspect
        install
        ls
        push
        rm
        set
        upgrade
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_plugin_create() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--compress --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                return
            elif [ "$cword" -eq  "$((counter + 1))" ]; then
                _filedir -d
            fi
            ;;
    esac
}

_docker_plugin_disable() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_plugins_installed --filter enabled=true
            fi
            ;;
    esac
}

_docker_plugin_enable() {
    case "$prev" in
        --timeout)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --timeout" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--timeout')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_plugins_installed --filter enabled=false
            fi
            ;;
    esac
}

_docker_plugin_inspect() {
    case "$prev" in
        --format|f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_plugins_installed
            ;;
    esac
}

_docker_plugin_install() {
    case "$prev" in
        --alias)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--alias --disable --disable-content-trust=false --grant-all-permissions --help" -- "$cur" ) )
            ;;
    esac
}

_docker_plugin_list() {
    _docker_plugin_ls
}

_docker_plugin_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        capability)
            COMPREPLY=( $( compgen -W "authz ipamdriver logdriver metricscollector networkdriver volumedriver" -- "${cur##*=}" ) )
            return
            ;;
        enabled)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "capability enabled" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_plugin_push() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_plugins_installed
            fi
            ;;
    esac
}

_docker_plugin_remove() {
    _docker_plugin_rm
}

_docker_plugin_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_plugins_installed
            ;;
    esac
}

_docker_plugin_set() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_plugins_installed
            fi
            ;;
    esac
}

_docker_plugin_upgrade() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--disable-content-trust --grant-all-permissions --help --skip-remote-check" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_plugins_installed
                __ltrim_colon_completions "$cur"
            elif [ "$cword" -eq  "$((counter + 1))" ]; then
                local plugin_images="$(__docker_plugins_installed)"
                COMPREPLY=( $(compgen -S : -W "${plugin_images%:*}" -- "$cur") )
                __docker_nospace
            fi
            ;;
    esac
}


_docker_port() {
    _docker_container_port
}

_docker_ps() {
    _docker_container_ls
}

_docker_pull() {
    _docker_image_pull
}

_docker_push() {
    _docker_image_push
}

_docker_rename() {
    _docker_container_rename
}

_docker_restart() {
    _docker_container_restart
}

_docker_rm() {
    _docker_container_rm
}

_docker_rmi() {
    _docker_image_rm
}

_docker_run() {
    _docker_container_run
}

_docker_save() {
    _docker_image_save
}


_docker_secret() {
    local subcommands="
        create
        inspect
        ls
        rm
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_secret_create() {
    case "$prev" in
        --driver|-d|--label|-l)
            return
            ;;
        --template-driver)
            COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--driver -d --help --label -l --template-driver" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--driver|-d|--label|-l|--template-driver')
            if [ "$cword" -eq "$((counter + 1))" ]; then
                _filedir
            fi
            ;;
    esac
}

_docker_secret_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
            ;;
        *)
            __docker_complete_secrets
            ;;
    esac
}

_docker_secret_list() {
    _docker_secret_ls
}

_docker_secret_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        id)
            __docker_complete_secrets --cur "${cur##*=}" --id
            return
            ;;
        name)
            __docker_complete_secrets --cur "${cur##*=}" --name
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_secret_remove() {
    _docker_secret_rm
}

_docker_secret_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_secrets
            ;;
    esac
}



_docker_search() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        is-automated)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
        is-official)
            COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "is-automated is-official stars" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format|--limit)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --limit --no-trunc" -- "$cur" ) )
            ;;
    esac
}


_docker_stack() {
    local subcommands="
        deploy
        ls
        ps
        rm
        services
    "
    local aliases="
        down
        list
        remove
        up
    "

    __docker_complete_stack_orchestrator_options && return
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            local options="--help --orchestrator"
            __docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_stack_deploy() {
    __docker_complete_stack_orchestrator_options && return

    case "$prev" in
        --bundle-file)
            _filedir dab
            return
            ;;
        --compose-file|-c)
            _filedir yml
            return
            ;;
        --resolve-image)
            COMPREPLY=( $( compgen -W "always changed never" -- "$cur" ) )
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--compose-file -c --help --orchestrator"
            __docker_server_is_experimental && __docker_stack_orchestrator_is swarm && options+=" --bundle-file"
            __docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
            __docker_stack_orchestrator_is swarm && options+=" --prune --resolve-image --with-registry-auth"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--bundle-file|--compose-file|-c|--kubeconfig|--namespace|--orchestrator|--resolve-image')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_stacks
            fi
            ;;
    esac
}

_docker_stack_down() {
    _docker_stack_rm
}

_docker_stack_list() {
    _docker_stack_ls
}

_docker_stack_ls() {
    __docker_complete_stack_orchestrator_options && return

    case "$prev" in
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--format --help --orchestrator"
            __docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
    esac
}

_docker_stack_ps() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        desired-state)
            COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
            return
            ;;
        id)
            __docker_complete_stacks --cur "${cur##*=}" --id
            return
            ;;
        name)
            __docker_complete_stacks --cur "${cur##*=}" --name
            return
            ;;
    esac

    __docker_complete_stack_orchestrator_options && return

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "id name desired-state" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--filter -f --format --help --no-resolve --no-trunc --orchestrator --quiet -q"
            __docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--all-namespaces|--filter|-f|--format|--kubeconfig|--namespace')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_stacks
            fi
            ;;
    esac
}

_docker_stack_remove() {
    _docker_stack_rm
}

_docker_stack_rm() {
    __docker_complete_stack_orchestrator_options && return

    case "$cur" in
        -*)
            local options="--help --orchestrator"
            __docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            __docker_complete_stacks
            ;;
    esac
}

_docker_stack_services() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        id)
            __docker_complete_services --cur "${cur##*=}" --id
            return
            ;;
        label)
            return
            ;;
        name)
            __docker_complete_services --cur "${cur##*=}" --name
            return
            ;;
    esac

    __docker_complete_stack_orchestrator_options && return

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--filter -f --format --help --orchestrator --quiet -q"
            __docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag '--filter|-f|--format|--kubeconfig|--namespace|--orchestrator')
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_stacks
            fi
            ;;
    esac
}

_docker_stack_up() {
    _docker_stack_deploy
}


_docker_start() {
    _docker_container_start
}

_docker_stats() {
    _docker_container_stats
}

_docker_stop() {
    _docker_container_stop
}


_docker_system() {
    local subcommands="
        df
        events
        info
        prune
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_system_df() {
    case "$prev" in
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format --help --verbose -v" -- "$cur" ) )
            ;;
    esac
}

_docker_system_events() {
    local key=$(__docker_map_key_of_current_option '-f|--filter')
    case "$key" in
        container)
            __docker_complete_containers_all --cur "${cur##*=}"
            return
            ;;
        daemon)
            local name=$(__docker_q info | sed -n 's/^\(ID\|Name\): //p')
            COMPREPLY=( $( compgen -W "$name" -- "${cur##*=}" ) )
            return
            ;;
        event)
            COMPREPLY=( $( compgen -W "
                attach
                commit
                connect
                copy
                create
                delete
                destroy
                detach
                die
                disable
                disconnect
                enable
                exec_create
                exec_detach
                exec_die
                exec_start
                export
                health_status
                import
                install
                kill
                load
                mount
                oom
                pause
                pull
                push
                reload
                remove
                rename
                resize
                restart
                save
                start
                stop
                tag
                top
                unmount
                unpause
                untag
                update
            " -- "${cur##*=}" ) )
            return
            ;;
        image)
            __docker_complete_images --cur "${cur##*=}" --repo --tag
            return
            ;;
        network)
            __docker_complete_networks --cur "${cur##*=}"
            return
            ;;
        scope)
            COMPREPLY=( $( compgen -W "local swarm" -- "${cur##*=}" ) )
            return
            ;;
        type)
            COMPREPLY=( $( compgen -W "config container daemon image network plugin secret service volume" -- "${cur##*=}" ) )
            return
            ;;
        volume)
            __docker_complete_volumes --cur "${cur##*=}"
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "container daemon event image label network scope type volume" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --since|--until)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --help --since --until --format" -- "$cur" ) )
            ;;
    esac
}

_docker_system_info() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
            ;;
    esac
}

_docker_system_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help --volumes" -- "$cur" ) )
            ;;
    esac
}


_docker_tag() {
    _docker_image_tag
}


_docker_trust() {
    local subcommands="
        inspect
        revoke
        sign
    "
    __docker_subcommands "$subcommands" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_trust_inspect() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --pretty" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --repo --tag
            fi
            ;;
    esac
}

_docker_trust_revoke() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --yes -y" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --repo --tag
            fi
            ;;
    esac
}

_docker_trust_sign() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help --local" -- "$cur" ) )
            ;;
        *)
            local counter=$(__docker_pos_first_nonflag)
            if [ "$cword" -eq "$counter" ]; then
                __docker_complete_images --force-tag --id
            fi
            ;;
    esac
}


_docker_unpause() {
    _docker_container_unpause
}

_docker_update() {
    _docker_container_update
}

_docker_top() {
    _docker_container_top
}

_docker_version() {
    __docker_complete_stack_orchestrator_options && return

    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            local options="--format -f --help"
            __docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            ;;
    esac
}

_docker_volume_create() {
    case "$prev" in
        --driver|-d)
            __docker_complete_plugins_bundled --type Volume
            return
            ;;
        --label|--opt|-o)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--driver -d --help --label --opt -o" -- "$cur" ) )
            ;;
    esac
}

_docker_volume_inspect() {
    case "$prev" in
        --format|-f)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_volumes
            ;;
    esac
}

_docker_volume_list() {
    _docker_volume_ls
}

_docker_volume_ls() {
    local key=$(__docker_map_key_of_current_option '--filter|-f')
    case "$key" in
        dangling)
            COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
            return
            ;;
        driver)
            __docker_complete_plugins_bundled --cur "${cur##*=}" --type Volume
            return
            ;;
        name)
            __docker_complete_volumes --cur "${cur##*=}"
            return
            ;;
    esac

    case "$prev" in
        --filter|-f)
            COMPREPLY=( $( compgen -S = -W "dangling driver label name" -- "$cur" ) )
            __docker_nospace
            return
            ;;
        --format)
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
            ;;
    esac
}

_docker_volume_prune() {
    case "$prev" in
        --filter)
            COMPREPLY=( $( compgen -W "label label!" -S = -- "$cur" ) )
            __docker_nospace
            return
            ;;
    esac

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--filter --force -f --help" -- "$cur" ) )
            ;;
    esac
}

_docker_volume_remove() {
    _docker_volume_rm
}

_docker_volume_rm() {
    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
            ;;
        *)
            __docker_complete_volumes
            ;;
    esac
}

_docker_volume() {
    local subcommands="
        create
        inspect
        ls
        prune
        rm
    "
    local aliases="
        list
        remove
    "
    __docker_subcommands "$subcommands $aliases" && return

    case "$cur" in
        -*)
            COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
            ;;
        *)
            COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
            ;;
    esac
}

_docker_wait() {
    _docker_container_wait
}

_docker() {
    local previous_extglob_setting=$(shopt -p extglob)
    shopt -s extglob

    local management_commands=(
        builder
        config
        container
        context
        engine
        image
        network
        node
        plugin
        secret
        service
        stack
        swarm
        system
        trust
        volume
    )

    local top_level_commands=(
        build
        login
        logout
        run
        search
        version
    )

    local legacy_commands=(
        attach
        commit
        cp
        create
        diff
        events
        exec
        export
        history
        images
        import
        info
        inspect
        kill
        load
        logs
        pause
        port
        ps
        pull
        push
        rename
        restart
        rm
        rmi
        save
        start
        stats
        stop
        tag
        top
        unpause
        update
        wait
    )

    local experimental_client_commands=(
        manifest
    )

    local experimental_server_commands=(
        checkpoint
        deploy
    )

    local commands=(${management_commands[*]} ${top_level_commands[*]})
    [ -z "$DOCKER_HIDE_LEGACY_COMMANDS" ] && commands+=(${legacy_commands[*]})

    local global_boolean_options="
        --debug -D
        --tls
        --tlsverify
    "
    local global_options_with_args="
        --config
        --context -c
        --host -H
        --log-level -l
        --tlscacert
        --tlscert
        --tlskey
    "

    local info_fetched server_experimental server_os
    local client_experimental stack_orchestrator_is_kubernetes stack_orchestrator_is_swarm

    local host config context

    COMPREPLY=()
    local cur prev words cword
    _get_comp_words_by_ref -n : cur prev words cword

    local command='docker' command_pos=0 subcommand_pos
    local counter=1
    while [ "$counter" -lt "$cword" ]; do
        case "${words[$counter]}" in
            docker)
                return 0
                ;;
            --host|-H)
                (( counter++ ))
                host="${words[$counter]}"
                ;;
            --config)
                (( counter++ ))
                config="${words[$counter]}"
                ;;
            --context|-c)
                (( counter++ ))
                context="${words[$counter]}"
                ;;
            $(__docker_to_extglob "$global_options_with_args") )
                (( counter++ ))
                ;;
            -*)
                ;;
            =)
                (( counter++ ))
                ;;
            *)
                command="${words[$counter]}"
                command_pos=$counter
                break
                ;;
        esac
        (( counter++ ))
    done

    local binary="${words[0]}"
    if [[ $binary == ?(*/)dockerd ]] ; then
        command=daemon
        command_pos=0
    fi

    local completions_func=_docker_${command//-/_}
    declare -F $completions_func >/dev/null && $completions_func

    eval "$previous_extglob_setting"
    return 0
}

eval "$__docker_previous_extglob_setting"
unset __docker_previous_extglob_setting

complete -F _docker docker docker.exe dockerd dockerd.exe

Function Calls:
└─ __docker_complete_contexts
   ├─ __docker_q
   ├─ __docker_complete_configs
   |  └─ __docker_configs
   ├─ __docker_containers
   |  └─ __docker_q
   ├─ __docker_complete_containers_all
   |  └─ __docker_complete_containers
   ├─ __docker_complete_containers_running
   |  └─ __docker_complete_containers
   └─ __docker_contexts
      └─ __docker_q