2014-11-19 08:29:56 -05:00
|
|
|
#!/bin/bash
|
2013-10-15 05:02:31 -04:00
|
|
|
#
|
|
|
|
# bash completion file for core docker commands
|
|
|
|
#
|
2014-11-19 08:29:56 -05:00
|
|
|
# This script provides completion of:
|
2013-10-15 05:02:31 -04:00
|
|
|
# - commands and their options
|
2013-12-30 20:09:42 -05:00
|
|
|
# - container ids and names
|
2013-10-15 05:02:31 -04:00
|
|
|
# - image repos and tags
|
|
|
|
# - filepaths
|
|
|
|
#
|
|
|
|
# To enable the completions either:
|
|
|
|
# - place this file in /etc/bash_completion.d
|
|
|
|
# or
|
2014-11-19 08:29:56 -05:00
|
|
|
# - copy this file to e.g. ~/.docker-completion.sh and add the line
|
|
|
|
# below to your .bashrc after bash completion features are loaded
|
|
|
|
# . ~/.docker-completion.sh
|
2015-07-30 10:09:24 -04:00
|
|
|
#
|
|
|
|
# Configuration:
|
|
|
|
#
|
|
|
|
# You can tailor completion for the "events", "history", "inspect", "run",
|
|
|
|
# "rmi" and "save" commands by settings the following environment
|
|
|
|
# variables:
|
2015-10-06 18:45:32 -04:00
|
|
|
#
|
2015-07-30 10:09:24 -04:00
|
|
|
# DOCKER_COMPLETION_SHOW_IMAGE_IDS
|
|
|
|
# "none" - Show names only (default)
|
|
|
|
# "non-intermediate" - Show names and ids, but omit intermediate image IDs
|
|
|
|
# "all" - Show names and ids, including intermediate image IDs
|
2015-10-06 18:45:32 -04:00
|
|
|
#
|
2015-07-30 10:09:24 -04:00
|
|
|
# DOCKER_COMPLETION_SHOW_TAGS
|
|
|
|
# "yes" - include tags in completion options (default)
|
|
|
|
# "no" - don't include tags in completion options
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
#
|
|
|
|
# Note:
|
|
|
|
# Currently, the completions will not work if the docker daemon is not
|
|
|
|
# bound to the default communication port/socket
|
|
|
|
# If the docker daemon is using a unix socket for communication your user
|
|
|
|
# must have access to the socket for the completions to function correctly
|
2014-12-30 13:18:21 -05:00
|
|
|
#
|
|
|
|
# Note for developers:
|
2015-03-25 13:38:17 -04:00
|
|
|
# Please arrange options sorted alphabetically by long name with the short
|
2014-12-30 13:18:21 -05:00
|
|
|
# options immediately following their corresponding long form.
|
|
|
|
# This order should be applied to lists, alternatives and code blocks.
|
2013-10-15 05:02:31 -04:00
|
|
|
|
2014-01-20 03:26:01 -05:00
|
|
|
__docker_q() {
|
2015-08-03 12:53:51 -04:00
|
|
|
docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@"
|
2014-01-20 03:26:01 -05:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_all() {
|
|
|
|
local IFS=$'\n'
|
|
|
|
local containers=( $(__docker_q ps -aq --no-trunc) )
|
|
|
|
if [ "$1" ]; then
|
|
|
|
containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
|
|
|
|
fi
|
|
|
|
local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
|
|
|
|
names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
|
|
|
|
unset IFS
|
|
|
|
COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_running() {
|
|
|
|
__docker_containers_all '.State.Running'
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_stopped() {
|
|
|
|
__docker_containers_all 'not .State.Running'
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_pauseable() {
|
|
|
|
__docker_containers_all 'and .State.Running (not .State.Paused)'
|
2014-10-02 13:01:10 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_unpauseable() {
|
|
|
|
__docker_containers_all '.State.Paused'
|
2014-10-02 13:01:10 -04:00
|
|
|
}
|
|
|
|
|
2015-03-29 12:24:08 -04:00
|
|
|
__docker_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") )
|
|
|
|
}
|
|
|
|
|
|
|
|
__docker_container_ids() {
|
|
|
|
local containers=( $(__docker_q ps -aq) )
|
|
|
|
COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
|
|
|
|
}
|
|
|
|
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images() {
|
|
|
|
local images_args=""
|
|
|
|
|
|
|
|
case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
|
|
|
|
all)
|
|
|
|
images_args="--no-trunc -a"
|
|
|
|
;;
|
|
|
|
non-intermediate)
|
|
|
|
images_args="--no-trunc"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
local repo_print_command
|
|
|
|
if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
|
|
|
|
repo_print_command='print $1; print $1":"$2'
|
|
|
|
else
|
|
|
|
repo_print_command='print $1'
|
|
|
|
fi
|
|
|
|
|
|
|
|
local awk_script
|
|
|
|
case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
|
|
|
|
all|non-intermediate)
|
|
|
|
awk_script='NR>1 { print $3; if ($1 != "<none>") { '"$repo_print_command"' } }'
|
|
|
|
;;
|
|
|
|
none|*)
|
|
|
|
awk_script='NR>1 && $1 != "<none>" { '"$repo_print_command"' }'
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
local images=$(__docker_q images $images_args | awk "$awk_script")
|
|
|
|
COMPREPLY=( $(compgen -W "$images" -- "$cur") )
|
|
|
|
__ltrim_colon_completions "$cur"
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_image_repos() {
|
|
|
|
local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
|
|
|
|
COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_image_repos_and_tags() {
|
|
|
|
local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
|
|
|
|
COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
|
2013-10-15 05:02:31 -04:00
|
|
|
__ltrim_colon_completions "$cur"
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_containers_and_images() {
|
|
|
|
__docker_containers_all
|
|
|
|
local containers=( "${COMPREPLY[@]}" )
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2014-10-02 17:13:37 -04:00
|
|
|
COMPREPLY+=( "${containers[@]}" )
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2015-10-11 11:08:44 -04:00
|
|
|
__docker_networks() {
|
|
|
|
COMPREPLY=( $(compgen -W "$(__docker_q network ls | awk 'NR>1 {print $2}')" -- "$cur") )
|
|
|
|
}
|
|
|
|
|
2015-09-07 16:18:29 -04:00
|
|
|
__docker_volumes() {
|
|
|
|
COMPREPLY=( $(compgen -W "$(__docker_q volume ls -q)" -- "$cur") )
|
|
|
|
}
|
|
|
|
|
2015-07-13 12:06:22 -04:00
|
|
|
# Finds the position of the first word that is neither option nor an option's argument.
|
|
|
|
# If there are options that require arguments, you should pass a glob describing those
|
|
|
|
# options, e.g. "--option1|-o|--option2"
|
|
|
|
# Use this function to restrict completions to exact positions after the argument list.
|
2014-10-02 17:13:37 -04:00
|
|
|
__docker_pos_first_nonflag() {
|
2014-01-11 03:00:03 -05:00
|
|
|
local argument_flags=$1
|
|
|
|
|
2015-10-11 09:32:47 -04:00
|
|
|
local counter=$((${subcommand_pos:-${command_pos}} + 1))
|
2014-01-11 03:00:03 -05:00
|
|
|
while [ $counter -le $cword ]; do
|
|
|
|
if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
|
|
|
|
(( counter++ ))
|
2015-07-13 12:06:22 -04:00
|
|
|
# eat "=" in case of --option=arg syntax
|
|
|
|
[ "${words[$counter]}" = "=" ] && (( counter++ ))
|
2014-01-11 03:00:03 -05:00
|
|
|
else
|
|
|
|
case "${words[$counter]}" in
|
|
|
|
-*)
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
2015-07-13 12:06:22 -04:00
|
|
|
|
|
|
|
# Bash splits words at "=", retaining "=" as a word, examples:
|
|
|
|
# "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
|
|
|
|
while [ "${words[$counter + 1]}" = "=" ] ; do
|
|
|
|
counter=$(( counter + 2))
|
|
|
|
done
|
|
|
|
|
2014-01-11 03:00:03 -05:00
|
|
|
(( counter++ ))
|
|
|
|
done
|
|
|
|
|
|
|
|
echo $counter
|
|
|
|
}
|
|
|
|
|
2015-07-13 11:28:25 -04:00
|
|
|
# Returns the value of the first option matching option_glob.
|
|
|
|
# Valid values for option_glob are option names like '--log-level' and
|
|
|
|
# globs like '--log-level|-l'
|
|
|
|
# Only positions between the command and the current word are considered.
|
|
|
|
__docker_value_of_option() {
|
2015-09-16 12:09:35 -04:00
|
|
|
local option_extglob=$(__docker_to_extglob "$1")
|
2015-07-13 11:28:25 -04:00
|
|
|
|
|
|
|
local counter=$((command_pos + 1))
|
|
|
|
while [ $counter -lt $cword ]; do
|
|
|
|
case ${words[$counter]} in
|
2015-09-16 12:09:35 -04:00
|
|
|
$option_extglob )
|
2015-07-13 11:28:25 -04:00
|
|
|
echo ${words[$counter + 1]}
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
(( counter++ ))
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2015-01-19 12:35:40 -05:00
|
|
|
# Transforms a multiline list of strings into a single line string
|
|
|
|
# with the words separated by "|".
|
|
|
|
# This is used to prepare arguments to __docker_pos_first_nonflag().
|
|
|
|
__docker_to_alternatives() {
|
|
|
|
local parts=( $1 )
|
|
|
|
local IFS='|'
|
|
|
|
echo "${parts[*]}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Transforms a multiline list of options into an extglob pattern
|
|
|
|
# suitable for use in case statements.
|
|
|
|
__docker_to_extglob() {
|
|
|
|
local extglob=$( __docker_to_alternatives "$1" )
|
|
|
|
echo "@($extglob)"
|
|
|
|
}
|
|
|
|
|
2015-10-11 09:32:47 -04:00
|
|
|
# Subcommand processing.
|
|
|
|
# Locates the first occurrence of any of the subcommands contained in the
|
|
|
|
# first argument. In case of a match, calls the corresponding completion
|
|
|
|
# function and returns 0.
|
|
|
|
# If no match is found, 1 is returned. The calling function can then
|
|
|
|
# continue processing its completion.
|
|
|
|
#
|
|
|
|
# TODO if the preceding command has options that accept arguments and an
|
|
|
|
# argument is equal ot one of the subcommands, this is falsely detected as
|
|
|
|
# a match.
|
|
|
|
__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
|
|
|
|
}
|
|
|
|
|
2015-09-22 15:17:30 -04:00
|
|
|
# suppress trailing whitespace
|
|
|
|
__docker_nospace() {
|
|
|
|
# compopt is not available in ancient bash versions
|
|
|
|
type compopt &>/dev/null && compopt -o nospace
|
|
|
|
}
|
|
|
|
|
2014-11-17 11:13:58 -05:00
|
|
|
__docker_resolve_hostname() {
|
|
|
|
command -v host >/dev/null 2>&1 || return
|
|
|
|
COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
|
|
|
|
}
|
|
|
|
|
|
|
|
__docker_capabilities() {
|
|
|
|
# The list of capabilities is defined in types.go, ALL was added manually.
|
|
|
|
COMPREPLY=( $( compgen -W "
|
|
|
|
ALL
|
|
|
|
AUDIT_CONTROL
|
|
|
|
AUDIT_WRITE
|
2015-02-11 02:46:32 -05:00
|
|
|
AUDIT_READ
|
2014-11-17 11:13:58 -05:00
|
|
|
BLOCK_SUSPEND
|
|
|
|
CHOWN
|
|
|
|
DAC_OVERRIDE
|
|
|
|
DAC_READ_SEARCH
|
|
|
|
FOWNER
|
|
|
|
FSETID
|
|
|
|
IPC_LOCK
|
|
|
|
IPC_OWNER
|
|
|
|
KILL
|
|
|
|
LEASE
|
|
|
|
LINUX_IMMUTABLE
|
|
|
|
MAC_ADMIN
|
|
|
|
MAC_OVERRIDE
|
|
|
|
MKNOD
|
|
|
|
NET_ADMIN
|
|
|
|
NET_BIND_SERVICE
|
|
|
|
NET_BROADCAST
|
|
|
|
NET_RAW
|
|
|
|
SETFCAP
|
|
|
|
SETGID
|
|
|
|
SETPCAP
|
|
|
|
SETUID
|
|
|
|
SYS_ADMIN
|
|
|
|
SYS_BOOT
|
|
|
|
SYS_CHROOT
|
|
|
|
SYSLOG
|
|
|
|
SYS_MODULE
|
|
|
|
SYS_NICE
|
|
|
|
SYS_PACCT
|
|
|
|
SYS_PTRACE
|
|
|
|
SYS_RAWIO
|
|
|
|
SYS_RESOURCE
|
|
|
|
SYS_TIME
|
|
|
|
SYS_TTY_CONFIG
|
|
|
|
WAKE_ALARM
|
|
|
|
" -- "$cur" ) )
|
|
|
|
}
|
|
|
|
|
2015-07-13 10:59:34 -04:00
|
|
|
__docker_log_drivers() {
|
|
|
|
COMPREPLY=( $( compgen -W "
|
|
|
|
fluentd
|
|
|
|
gelf
|
|
|
|
journald
|
|
|
|
json-file
|
|
|
|
none
|
|
|
|
syslog
|
|
|
|
" -- "$cur" ) )
|
|
|
|
}
|
|
|
|
|
2015-07-13 11:28:25 -04:00
|
|
|
__docker_log_driver_options() {
|
|
|
|
# see docs/reference/logging/index.md
|
2015-09-18 10:20:05 -04:00
|
|
|
local fluentd_options="fluentd-address tag"
|
|
|
|
local gelf_options="gelf-address tag"
|
2015-08-12 07:37:16 -04:00
|
|
|
local json_file_options="max-file max-size"
|
2015-09-18 10:20:05 -04:00
|
|
|
local syslog_options="syslog-address syslog-facility tag"
|
2015-08-04 20:35:06 -04:00
|
|
|
local awslogs_options="awslogs-region awslogs-group awslogs-stream"
|
2015-07-23 08:19:13 -04:00
|
|
|
|
2015-07-13 11:28:25 -04:00
|
|
|
case $(__docker_value_of_option --log-driver) in
|
2015-07-23 08:19:13 -04:00
|
|
|
'')
|
2015-08-12 07:37:16 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $json_file_options $syslog_options" -S = -- "$cur" ) )
|
2015-07-23 08:19:13 -04:00
|
|
|
;;
|
2015-07-13 11:28:25 -04:00
|
|
|
fluentd)
|
2015-07-23 08:19:13 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
|
2015-07-13 11:28:25 -04:00
|
|
|
;;
|
|
|
|
gelf)
|
2015-07-23 08:19:13 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
|
2015-07-13 11:28:25 -04:00
|
|
|
;;
|
2015-08-12 07:37:16 -04:00
|
|
|
json-file)
|
|
|
|
COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
|
|
|
|
;;
|
2015-07-13 11:28:25 -04:00
|
|
|
syslog)
|
2015-07-23 08:19:13 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
|
2015-07-13 11:28:25 -04:00
|
|
|
;;
|
2015-08-04 20:35:06 -04:00
|
|
|
awslogs)
|
|
|
|
COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
|
|
|
|
;;
|
2015-07-13 11:28:25 -04:00
|
|
|
*)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-07-13 11:28:25 -04:00
|
|
|
}
|
|
|
|
|
2015-07-20 14:46:18 -04:00
|
|
|
__docker_complete_log_driver_options() {
|
|
|
|
# "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
|
|
|
|
# it is the last character or not. So we search for "xxx=" in the the last two words.
|
|
|
|
case "${words[$cword-2]}$prev=" in
|
|
|
|
*gelf-address=*)
|
|
|
|
COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-07-20 14:46:18 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
*syslog-address=*)
|
|
|
|
COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-07-20 14:46:18 -04:00
|
|
|
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
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2015-07-31 14:02:03 -04:00
|
|
|
__docker_log_levels() {
|
|
|
|
COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
|
|
|
|
}
|
|
|
|
|
2015-02-02 15:16:18 -05:00
|
|
|
# a selection of the available signals that is most likely of interest in the
|
|
|
|
# context of docker containers.
|
|
|
|
__docker_signals() {
|
|
|
|
local signals=(
|
|
|
|
SIGCONT
|
|
|
|
SIGHUP
|
|
|
|
SIGINT
|
|
|
|
SIGKILL
|
|
|
|
SIGQUIT
|
|
|
|
SIGSTOP
|
|
|
|
SIGTERM
|
|
|
|
SIGUSR1
|
|
|
|
SIGUSR2
|
|
|
|
)
|
|
|
|
COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
|
|
|
|
}
|
|
|
|
|
2015-06-14 15:03:41 -04:00
|
|
|
# global options that may appear after the docker command
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_docker() {
|
2015-01-19 12:35:40 -05:00
|
|
|
local boolean_options="
|
2015-07-31 14:02:03 -04:00
|
|
|
$global_boolean_options
|
2015-08-10 10:07:50 -04:00
|
|
|
--help
|
2015-01-19 12:35:40 -05:00
|
|
|
--version -v
|
|
|
|
"
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2015-08-03 12:53:51 -04:00
|
|
|
--config)
|
|
|
|
_filedir -d
|
|
|
|
return
|
|
|
|
;;
|
2015-01-19 12:35:40 -05:00
|
|
|
--log-level|-l)
|
2015-07-31 14:02:03 -04:00
|
|
|
__docker_log_levels
|
2015-01-19 12:35:40 -05:00
|
|
|
return
|
|
|
|
;;
|
2015-06-14 15:03:41 -04:00
|
|
|
$(__docker_to_extglob "$global_options_with_args") )
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-06-14 15:03:41 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-07-31 13:25:42 -04:00
|
|
|
local counter=$( __docker_pos_first_nonflag $(__docker_to_extglob "$global_options_with_args") )
|
2015-07-23 07:52:06 -04:00
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
|
|
|
|
fi
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_attach() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter="$(__docker_pos_first_nonflag)"
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_running
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_build() {
|
2015-10-16 05:25:46 -04:00
|
|
|
local options_with_args="
|
|
|
|
--build-arg
|
|
|
|
--cgroup-parent
|
|
|
|
--cpuset-cpus
|
|
|
|
--cpuset-mems
|
2015-10-16 15:05:18 -04:00
|
|
|
--cpu-shares
|
2015-10-16 05:25:46 -04:00
|
|
|
--cpu-period
|
|
|
|
--cpu-quota
|
|
|
|
--file -f
|
|
|
|
--memory -m
|
|
|
|
--memory-swap
|
|
|
|
--tag -t
|
|
|
|
--ulimit
|
|
|
|
"
|
|
|
|
|
|
|
|
local boolean_options="
|
|
|
|
--disable-content-trust=false
|
|
|
|
--force-rm
|
|
|
|
--help
|
|
|
|
--no-cache
|
|
|
|
--pull
|
|
|
|
--quiet -q
|
|
|
|
--rm
|
|
|
|
"
|
|
|
|
|
|
|
|
local all_options="$options_with_args $boolean_options"
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2015-10-16 05:25:46 -04:00
|
|
|
--build-arg)
|
|
|
|
COMPREPLY=( $( compgen -e -- "$cur" ) )
|
|
|
|
__docker_nospace
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-03-06 02:13:27 -05:00
|
|
|
--file|-f)
|
|
|
|
_filedir
|
2015-03-25 13:38:17 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-05-28 11:06:47 -04:00
|
|
|
--tag|-t)
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
return
|
|
|
|
;;
|
2015-10-16 05:25:46 -04:00
|
|
|
$(__docker_to_extglob "$options_with_args") )
|
|
|
|
return
|
|
|
|
;;
|
2013-10-15 05:02:31 -04:00
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-10-16 05:25:46 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-10-16 05:25:46 -04:00
|
|
|
local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
if [ $cword -eq $counter ]; then
|
2014-07-08 22:26:23 -04:00
|
|
|
_filedir -d
|
2014-01-11 03:00:03 -05:00
|
|
|
fi
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_commit() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2015-03-17 12:06:23 -04:00
|
|
|
--author|-a|--change|-c|--message|-m)
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-03-17 12:06:23 -04:00
|
|
|
local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
|
2013-10-15 05:02:31 -04:00
|
|
|
|
2014-01-11 03:00:03 -05:00
|
|
|
if [ $cword -eq $counter ]; then
|
2013-10-15 05:02:31 -04:00
|
|
|
__docker_containers_all
|
2014-01-11 03:00:03 -05:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
(( counter++ ))
|
|
|
|
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
return
|
2013-10-15 05:02:31 -04:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_cp() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
case "$cur" in
|
|
|
|
*:)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*)
|
2015-10-18 11:16:15 -04:00
|
|
|
# combined container and filename completion
|
|
|
|
_filedir
|
|
|
|
local files=( ${COMPREPLY[@]} )
|
|
|
|
|
2015-03-17 12:06:23 -04:00
|
|
|
__docker_containers_all
|
|
|
|
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
|
2015-10-18 11:16:15 -04:00
|
|
|
local containers=( ${COMPREPLY[@]} )
|
|
|
|
|
|
|
|
COMPREPLY=( $( compgen -W "${files[*]} ${containers[*]}" -- "$cur" ) )
|
|
|
|
if [[ "$COMPREPLY" == *: ]]; then
|
|
|
|
__docker_nospace
|
|
|
|
fi
|
2015-03-17 12:06:23 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
(( counter++ ))
|
2014-01-11 03:00:03 -05:00
|
|
|
|
2015-03-17 12:06:23 -04:00
|
|
|
if [ $cword -eq $counter ]; then
|
2015-10-18 11:16:15 -04:00
|
|
|
if [ -e "$prev" ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
|
|
|
|
__docker_nospace
|
|
|
|
else
|
|
|
|
_filedir
|
|
|
|
fi
|
2015-03-17 12:06:23 -04:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_create() {
|
2014-12-15 15:07:41 -05:00
|
|
|
_docker_run
|
2014-08-11 13:12:09 -04:00
|
|
|
}
|
|
|
|
|
2015-06-14 15:03:41 -04:00
|
|
|
_docker_daemon() {
|
|
|
|
local boolean_options="
|
2015-07-31 14:02:03 -04:00
|
|
|
$global_boolean_options
|
2015-10-06 18:45:32 -04:00
|
|
|
--disable-legacy-registry
|
2015-08-10 10:07:50 -04:00
|
|
|
--help
|
2015-06-14 15:03:41 -04:00
|
|
|
--icc=false
|
|
|
|
--ip-forward=false
|
|
|
|
--ip-masq=false
|
|
|
|
--iptables=false
|
|
|
|
--ipv6
|
|
|
|
--selinux-enabled
|
|
|
|
--userland-proxy=false
|
|
|
|
"
|
|
|
|
local options_with_args="
|
2015-07-31 14:02:03 -04:00
|
|
|
$global_options_with_args
|
2015-06-14 15:03:41 -04:00
|
|
|
--api-cors-header
|
|
|
|
--bip
|
|
|
|
--bridge -b
|
2015-09-28 05:23:23 -04:00
|
|
|
--cluster-advertise
|
|
|
|
--cluster-store
|
2015-10-09 07:57:15 -04:00
|
|
|
--cluster-store-opt
|
2015-06-14 15:03:41 -04:00
|
|
|
--default-gateway
|
|
|
|
--default-gateway-v6
|
|
|
|
--default-ulimit
|
|
|
|
--dns
|
|
|
|
--dns-search
|
2015-08-31 14:47:25 -04:00
|
|
|
--dns-opt
|
2015-06-14 15:03:41 -04:00
|
|
|
--exec-driver -e
|
|
|
|
--exec-opt
|
|
|
|
--exec-root
|
|
|
|
--fixed-cidr
|
|
|
|
--fixed-cidr-v6
|
|
|
|
--graph -g
|
|
|
|
--group -G
|
|
|
|
--insecure-registry
|
|
|
|
--ip
|
|
|
|
--label
|
|
|
|
--log-driver
|
|
|
|
--log-opt
|
|
|
|
--mtu
|
|
|
|
--pidfile -p
|
|
|
|
--registry-mirror
|
|
|
|
--storage-driver -s
|
|
|
|
--storage-opt
|
|
|
|
"
|
|
|
|
|
|
|
|
case "$prev" in
|
2015-09-28 05:23:23 -04:00
|
|
|
--cluster-store)
|
|
|
|
COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
|
|
|
|
__docker_nospace
|
|
|
|
return
|
|
|
|
;;
|
2015-10-09 07:57:15 -04:00
|
|
|
--cluster-store-opt)
|
|
|
|
COMPREPLY=( $( compgen -W "kv.cacertfile kv.certfile kv.keyfile" -S = -- "$cur" ) )
|
|
|
|
__docker_nospace
|
|
|
|
return
|
|
|
|
;;
|
2015-06-14 15:03:41 -04:00
|
|
|
--exec-root|--graph|-g)
|
|
|
|
_filedir -d
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--log-driver)
|
|
|
|
__docker_log_drivers
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--pidfile|-p|--tlscacert|--tlscert|--tlskey)
|
|
|
|
_filedir
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--storage-driver|-s)
|
2015-08-10 11:49:40 -04:00
|
|
|
COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
|
2015-06-14 15:03:41 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-08-12 08:51:07 -04:00
|
|
|
--storage-opt)
|
|
|
|
local devicemapper_options="
|
|
|
|
dm.basesize
|
|
|
|
dm.blkdiscard
|
|
|
|
dm.blocksize
|
|
|
|
dm.fs
|
|
|
|
dm.loopdatasize
|
|
|
|
dm.loopmetadatasize
|
|
|
|
dm.mkfsarg
|
|
|
|
dm.mountopt
|
|
|
|
dm.override_udev_sync_check
|
|
|
|
dm.thinpooldev
|
2015-10-18 07:39:52 -04:00
|
|
|
dm.use_deferred_deletion
|
|
|
|
dm.use_deferred_removal
|
2015-08-12 08:51:07 -04:00
|
|
|
"
|
|
|
|
local zfs_options="zfs.fsname"
|
|
|
|
|
|
|
|
case $(__docker_value_of_option '--storage-driver|-s') in
|
|
|
|
'')
|
|
|
|
COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
devicemapper)
|
|
|
|
COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
zfs)
|
|
|
|
COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-08-12 08:51:07 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-07-31 14:02:03 -04:00
|
|
|
--log-level|-l)
|
|
|
|
__docker_log_levels
|
|
|
|
return
|
|
|
|
;;
|
2015-06-14 15:03:41 -04:00
|
|
|
--log-opt)
|
|
|
|
__docker_log_driver_options
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
$(__docker_to_extglob "$options_with_args") )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2015-08-17 09:48:50 -04:00
|
|
|
__docker_complete_log_driver_options && return
|
|
|
|
|
2015-08-12 08:51:07 -04:00
|
|
|
case "${words[$cword-2]}$prev=" in
|
2015-10-09 07:57:15 -04:00
|
|
|
# completions for --storage-opt
|
2015-10-18 07:39:52 -04:00
|
|
|
*dm.@(blkdiscard|override_udev_sync_check|use_deferred_@(removal|deletion))=*)
|
2015-08-12 08:51:07 -04:00
|
|
|
COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*dm.fs=*)
|
|
|
|
COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*dm.thinpooldev=*)
|
|
|
|
_filedir
|
|
|
|
return
|
|
|
|
;;
|
2015-10-09 07:57:15 -04:00
|
|
|
# completions for --cluster-store-opt
|
|
|
|
*kv.*file=*)
|
|
|
|
_filedir
|
|
|
|
return
|
|
|
|
;;
|
2015-08-12 08:51:07 -04:00
|
|
|
esac
|
|
|
|
|
2015-06-14 15:03:41 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_diff() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_events() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2015-02-19 07:43:09 -05:00
|
|
|
--filter|-f)
|
|
|
|
COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-02-19 07:43:09 -05:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
--since|--until)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "${words[$cword-2]}$prev=" in
|
|
|
|
*container=*)
|
|
|
|
cur="${cur#=}"
|
|
|
|
__docker_containers_all
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*event=*)
|
2015-07-07 02:58:35 -04:00
|
|
|
COMPREPLY=( $( compgen -W "
|
|
|
|
attach
|
|
|
|
commit
|
|
|
|
copy
|
|
|
|
create
|
|
|
|
delete
|
|
|
|
destroy
|
|
|
|
die
|
|
|
|
exec_create
|
|
|
|
exec_start
|
|
|
|
export
|
|
|
|
import
|
|
|
|
kill
|
|
|
|
oom
|
|
|
|
pause
|
|
|
|
pull
|
|
|
|
push
|
|
|
|
rename
|
|
|
|
resize
|
|
|
|
restart
|
|
|
|
start
|
|
|
|
stop
|
|
|
|
tag
|
|
|
|
top
|
|
|
|
unpause
|
|
|
|
untag
|
|
|
|
" -- "${cur#=}" ) )
|
2015-02-19 07:43:09 -05:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
*image=*)
|
|
|
|
cur="${cur#=}"
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_exec() {
|
2015-05-28 11:06:47 -04:00
|
|
|
case "$prev" in
|
|
|
|
--user|-u)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2014-09-16 14:46:24 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-06-19 02:01:50 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) )
|
2014-09-16 14:46:24 -04:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_running
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_export() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_help() {
|
2014-01-11 03:00:03 -05:00
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
2014-10-02 17:13:37 -04:00
|
|
|
COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_history() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2014-01-11 03:00:03 -05:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_images() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$prev" in
|
|
|
|
--filter|-f)
|
2015-03-29 12:24:08 -04:00
|
|
|
COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
|
|
|
|
if [ "$COMPREPLY" = "label=" ]; then
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-03-29 12:24:08 -04:00
|
|
|
fi
|
2015-03-17 12:06:23 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "${words[$cword-2]}$prev=" in
|
|
|
|
*dangling=*)
|
|
|
|
COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
|
|
|
|
return
|
|
|
|
;;
|
2015-03-29 12:24:08 -04:00
|
|
|
*label=*)
|
|
|
|
return
|
|
|
|
;;
|
2015-03-17 12:06:23 -04:00
|
|
|
esac
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-31 22:35:05 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
2015-03-29 12:24:08 -04:00
|
|
|
=)
|
|
|
|
return
|
|
|
|
;;
|
2013-10-15 05:02:31 -04:00
|
|
|
*)
|
2015-03-29 12:24:08 -04:00
|
|
|
__docker_image_repos
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_import() {
|
2015-10-16 04:32:27 -04:00
|
|
|
case "$prev" in
|
|
|
|
--change|-c|--message|-m)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-10-16 04:32:27 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--change -c --help --message -m" -- "$cur" ) )
|
2015-03-17 12:06:23 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-10-16 04:32:27 -04:00
|
|
|
local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m')
|
2015-03-17 12:06:23 -04:00
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
(( counter++ ))
|
2014-01-11 03:00:03 -05:00
|
|
|
|
2015-03-17 12:06:23 -04:00
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_info() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_inspect() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--format|-f)
|
2014-01-11 03:00:03 -05:00
|
|
|
return
|
|
|
|
;;
|
2015-06-26 10:47:31 -04:00
|
|
|
--type)
|
|
|
|
COMPREPLY=( $( compgen -W "image container" -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
|
2014-01-11 03:00:03 -05:00
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-10-14 11:34:56 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--format -f --help --size -s --type" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
2015-08-01 11:36:00 -04:00
|
|
|
case $(__docker_value_of_option --type) in
|
|
|
|
'')
|
|
|
|
__docker_containers_and_images
|
|
|
|
;;
|
|
|
|
container)
|
|
|
|
__docker_containers_all
|
|
|
|
;;
|
|
|
|
image)
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2015-08-01 11:36:00 -04:00
|
|
|
;;
|
|
|
|
esac
|
2014-01-11 03:00:03 -05:00
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_kill() {
|
2015-02-02 15:16:18 -05:00
|
|
|
case "$prev" in
|
|
|
|
--signal|-s)
|
|
|
|
__docker_signals
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
|
2015-02-02 15:16:18 -05:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_running
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_load() {
|
2014-12-29 13:21:45 -05:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--input|-i)
|
2014-12-29 13:21:45 -05:00
|
|
|
_filedir
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
|
2014-12-29 13:21:45 -05:00
|
|
|
;;
|
|
|
|
esac
|
2014-01-11 03:00:03 -05:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_login() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--email|-e|--password|-p|--username|-u)
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_logout() {
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_logs() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$prev" in
|
2015-05-28 11:06:47 -04:00
|
|
|
--since|--tail)
|
2015-03-17 12:06:23 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-04-14 00:36:12 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
2015-03-17 12:06:23 -04:00
|
|
|
local counter=$(__docker_pos_first_nonflag '--tail')
|
2014-01-11 03:00:03 -05:00
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
2014-10-02 17:13:37 -04:00
|
|
|
|
2015-10-11 11:08:44 -04:00
|
|
|
_docker_network_connect() {
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag '--tail')
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_networks
|
|
|
|
elif [ $cword -eq $(($counter + 1)) ]; then
|
|
|
|
__docker_containers_running
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network_create() {
|
|
|
|
case "$prev" in
|
2015-10-18 08:42:23 -04:00
|
|
|
--aux-address|--gateway|--ip-range|--opt|-o|--subnet)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--ipam-driver)
|
|
|
|
COMPREPLY=( $( compgen -W "default" -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
2015-10-11 11:08:44 -04:00
|
|
|
--driver|-d)
|
|
|
|
# no need to suggest drivers that allow one instance only
|
|
|
|
# (host, null)
|
|
|
|
COMPREPLY=( $( compgen -W "bridge overlay" -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-10-18 08:42:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--aux-address --driver -d --gateway --help --ip-range --ipam-driver --opt -o --subnet" -- "$cur" ) )
|
2015-10-11 11:08:44 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network_disconnect() {
|
|
|
|
# TODO disconnect should only complete running containers connected
|
|
|
|
# to the specified network.
|
|
|
|
_docker_network_connect
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network_inspect() {
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
2015-10-22 11:53:17 -04:00
|
|
|
__docker_networks
|
2015-10-11 11:08:44 -04:00
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network_ls() {
|
|
|
|
case "$prev" in
|
|
|
|
-n)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-10-15 06:10:39 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
|
2015-10-11 11:08:44 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network_rm() {
|
|
|
|
_docker_network_inspect
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_network() {
|
|
|
|
local subcommands="
|
|
|
|
connect
|
|
|
|
create
|
|
|
|
disconnect
|
|
|
|
inspect
|
|
|
|
ls
|
|
|
|
rm
|
|
|
|
"
|
|
|
|
__docker_subcommands "$subcommands" && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_pause() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_pauseable
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2014-10-02 13:01:10 -04:00
|
|
|
}
|
2013-10-15 05:02:31 -04:00
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_port() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_ps() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--before|--since)
|
2014-06-19 12:11:32 -04:00
|
|
|
__docker_containers_all
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
2015-03-17 12:06:23 -04:00
|
|
|
--filter|-f)
|
2015-08-28 14:56:52 -04:00
|
|
|
COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2015-03-17 12:06:23 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-08-10 09:45:05 -04:00
|
|
|
--format|-n)
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2015-03-17 12:06:23 -04:00
|
|
|
case "${words[$cword-2]}$prev=" in
|
2015-09-01 02:47:02 -04:00
|
|
|
*ancestor=*)
|
|
|
|
cur="${cur#=}"
|
|
|
|
__docker_images
|
|
|
|
return
|
|
|
|
;;
|
2015-03-29 12:24:08 -04:00
|
|
|
*id=*)
|
|
|
|
cur="${cur#=}"
|
|
|
|
__docker_container_ids
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*name=*)
|
|
|
|
cur="${cur#=}"
|
|
|
|
__docker_container_names
|
|
|
|
return
|
|
|
|
;;
|
2015-03-17 12:06:23 -04:00
|
|
|
*status=*)
|
|
|
|
COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-08-10 09:45:05 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_pull() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-03-17 12:06:23 -04:00
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
2014-01-11 03:00:03 -05:00
|
|
|
if [ $cword -eq $counter ]; then
|
2015-05-01 12:04:24 -04:00
|
|
|
for arg in "${COMP_WORDS[@]}"; do
|
|
|
|
case "$arg" in
|
|
|
|
--all-tags|-a)
|
|
|
|
__docker_image_repos
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
2014-01-11 03:00:03 -05:00
|
|
|
__docker_image_repos_and_tags
|
|
|
|
fi
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_push() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2015-02-18 14:49:05 -05:00
|
|
|
_docker_rename() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_all
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2015-02-18 14:49:05 -05:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_restart() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--time|-t)
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_all
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_rm() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2014-06-26 00:12:25 -04:00
|
|
|
for arg in "${COMP_WORDS[@]}"; do
|
|
|
|
case "$arg" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--force|-f)
|
2014-06-26 00:12:25 -04:00
|
|
|
__docker_containers_all
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
2013-10-15 05:02:31 -04:00
|
|
|
__docker_containers_stopped
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_rmi() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2015-03-17 12:06:23 -04:00
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_run() {
|
2014-12-15 15:07:41 -05:00
|
|
|
local options_with_args="
|
|
|
|
--add-host
|
2014-12-30 13:18:21 -05:00
|
|
|
--attach -a
|
2015-08-11 12:17:32 -04:00
|
|
|
--blkio-weight
|
2014-12-15 15:07:41 -05:00
|
|
|
--cap-add
|
|
|
|
--cap-drop
|
2015-03-24 08:15:16 -04:00
|
|
|
--cgroup-parent
|
2014-12-15 15:07:41 -05:00
|
|
|
--cidfile
|
2015-04-08 04:58:59 -04:00
|
|
|
--cpu-period
|
2015-04-20 11:16:47 -04:00
|
|
|
--cpu-quota
|
2015-08-11 12:17:32 -04:00
|
|
|
--cpuset-cpus
|
|
|
|
--cpuset-mems
|
2015-10-16 15:05:18 -04:00
|
|
|
--cpu-shares
|
2014-12-15 15:07:41 -05:00
|
|
|
--device
|
|
|
|
--dns
|
2015-08-31 14:47:25 -04:00
|
|
|
--dns-opt
|
2014-12-15 15:07:41 -05:00
|
|
|
--dns-search
|
|
|
|
--entrypoint
|
2014-12-30 13:18:21 -05:00
|
|
|
--env -e
|
2014-12-15 15:07:41 -05:00
|
|
|
--env-file
|
|
|
|
--expose
|
2015-06-17 16:25:53 -04:00
|
|
|
--group-add
|
2014-12-30 13:18:21 -05:00
|
|
|
--hostname -h
|
2014-12-29 13:21:45 -05:00
|
|
|
--ipc
|
2015-08-19 11:56:55 -04:00
|
|
|
--kernel-memory
|
2015-03-24 08:15:16 -04:00
|
|
|
--label-file
|
2015-08-11 12:17:32 -04:00
|
|
|
--label -l
|
2014-12-15 15:07:41 -05:00
|
|
|
--link
|
2015-03-24 08:15:16 -04:00
|
|
|
--log-driver
|
2015-07-13 11:28:25 -04:00
|
|
|
--log-opt
|
2014-12-15 15:07:41 -05:00
|
|
|
--lxc-conf
|
2014-12-29 13:21:45 -05:00
|
|
|
--mac-address
|
2014-12-30 13:18:21 -05:00
|
|
|
--memory -m
|
2015-03-06 02:13:27 -05:00
|
|
|
--memory-swap
|
2015-08-11 12:17:32 -04:00
|
|
|
--memory-swappiness
|
2015-09-23 02:02:45 -04:00
|
|
|
--memory-reservation
|
2014-12-15 15:07:41 -05:00
|
|
|
--name
|
|
|
|
--net
|
2015-03-06 02:13:27 -05:00
|
|
|
--pid
|
2014-12-30 13:18:21 -05:00
|
|
|
--publish -p
|
2014-12-15 15:07:41 -05:00
|
|
|
--restart
|
|
|
|
--security-opt
|
2015-08-04 16:51:48 -04:00
|
|
|
--stop-signal
|
2015-03-09 08:36:09 -04:00
|
|
|
--ulimit
|
2015-08-11 12:17:32 -04:00
|
|
|
--user -u
|
2015-05-28 11:06:47 -04:00
|
|
|
--uts
|
2014-12-15 15:07:41 -05:00
|
|
|
--volumes-from
|
2014-12-30 13:18:21 -05:00
|
|
|
--volume -v
|
|
|
|
--workdir -w
|
2014-12-15 15:07:41 -05:00
|
|
|
"
|
|
|
|
|
2015-10-16 05:31:31 -04:00
|
|
|
local boolean_options="
|
2015-08-11 12:17:32 -04:00
|
|
|
--disable-content-trust=false
|
2015-03-06 02:13:27 -05:00
|
|
|
--help
|
2014-12-30 13:18:21 -05:00
|
|
|
--interactive -i
|
2015-08-11 12:17:32 -04:00
|
|
|
--oom-kill-disable
|
2014-12-15 15:07:41 -05:00
|
|
|
--privileged
|
2014-12-30 13:18:21 -05:00
|
|
|
--publish-all -P
|
2015-03-06 02:13:27 -05:00
|
|
|
--read-only
|
2014-12-30 13:18:21 -05:00
|
|
|
--tty -t
|
2014-12-15 15:07:41 -05:00
|
|
|
"
|
|
|
|
|
2015-10-16 05:31:31 -04:00
|
|
|
local all_options="$options_with_args $boolean_options"
|
|
|
|
|
2014-12-15 15:07:41 -05:00
|
|
|
[ "$command" = "run" ] && all_options="$all_options
|
2014-12-30 13:18:21 -05:00
|
|
|
--detach -d
|
2014-12-15 15:07:41 -05:00
|
|
|
--rm
|
2015-08-11 12:17:32 -04:00
|
|
|
--sig-proxy=false
|
2014-12-15 15:07:41 -05:00
|
|
|
"
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--add-host)
|
|
|
|
case "$cur" in
|
|
|
|
*:)
|
|
|
|
__docker_resolve_hostname
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
--attach|-a)
|
2014-06-29 01:09:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
2014-12-30 13:18:21 -05:00
|
|
|
--cap-add|--cap-drop)
|
|
|
|
__docker_capabilities
|
2014-06-29 01:09:23 -04:00
|
|
|
return
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
2015-03-28 14:32:33 -04:00
|
|
|
--cidfile|--env-file|--label-file)
|
2014-12-30 13:18:21 -05:00
|
|
|
_filedir
|
2014-06-29 01:09:23 -04:00
|
|
|
return
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
2015-02-16 13:23:29 -05:00
|
|
|
--device|--volume|-v)
|
2014-06-29 01:09:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
*:*)
|
|
|
|
# TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
|
|
|
|
;;
|
|
|
|
'')
|
|
|
|
COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-06-29 01:09:23 -04:00
|
|
|
;;
|
|
|
|
/*)
|
|
|
|
_filedir
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-06-29 01:09:23 -04:00
|
|
|
;;
|
|
|
|
esac
|
2014-01-11 03:00:03 -05:00
|
|
|
return
|
|
|
|
;;
|
2014-12-30 13:18:21 -05:00
|
|
|
--env|-e)
|
2014-01-11 03:00:03 -05:00
|
|
|
COMPREPLY=( $( compgen -e -- "$cur" ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-06-29 01:09:23 -04:00
|
|
|
return
|
|
|
|
;;
|
2014-12-29 13:21:45 -05:00
|
|
|
--ipc)
|
|
|
|
case "$cur" in
|
|
|
|
*:*)
|
|
|
|
cur="${cur#*:}"
|
|
|
|
__docker_containers_running
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
|
|
|
|
if [ "$COMPREPLY" = "container:" ]; then
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-12-29 13:21:45 -05:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return
|
|
|
|
;;
|
2014-06-29 01:09:23 -04:00
|
|
|
--link)
|
|
|
|
case "$cur" in
|
|
|
|
*:*)
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_running
|
|
|
|
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-06-29 01:09:23 -04:00
|
|
|
;;
|
|
|
|
esac
|
2014-01-11 03:00:03 -05:00
|
|
|
return
|
|
|
|
;;
|
2015-03-24 08:15:16 -04:00
|
|
|
--log-driver)
|
2015-07-13 10:59:34 -04:00
|
|
|
__docker_log_drivers
|
2015-03-24 08:15:16 -04:00
|
|
|
return
|
|
|
|
;;
|
2015-07-13 11:28:25 -04:00
|
|
|
--log-opt)
|
|
|
|
__docker_log_driver_options
|
|
|
|
return
|
|
|
|
;;
|
2014-11-17 11:13:58 -05:00
|
|
|
--net)
|
|
|
|
case "$cur" in
|
|
|
|
container:*)
|
|
|
|
local cur=${cur#*:}
|
|
|
|
__docker_containers_all
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
|
|
|
|
if [ "${COMPREPLY[*]}" = "container:" ] ; then
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-11-17 11:13:58 -05:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--restart)
|
|
|
|
case "$cur" in
|
|
|
|
on-failure:*)
|
|
|
|
;;
|
|
|
|
*)
|
2015-10-17 10:24:17 -04:00
|
|
|
COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") )
|
2014-11-17 11:13:58 -05:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--security-opt)
|
|
|
|
case "$cur" in
|
|
|
|
label:*:*)
|
|
|
|
;;
|
|
|
|
label:*)
|
|
|
|
local cur=${cur##*:}
|
|
|
|
COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
|
|
|
|
if [ "${COMPREPLY[*]}" != "disable" ] ; then
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-11-17 11:13:58 -05:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
|
2015-09-22 15:17:30 -04:00
|
|
|
__docker_nospace
|
2014-11-17 11:13:58 -05:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return
|
|
|
|
;;
|
2014-12-30 13:18:21 -05:00
|
|
|
--volumes-from)
|
|
|
|
__docker_containers_all
|
|
|
|
return
|
|
|
|
;;
|
2015-10-16 05:31:31 -04:00
|
|
|
$(__docker_to_extglob "$options_with_args") )
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2015-07-20 14:46:18 -04:00
|
|
|
__docker_complete_log_driver_options && return
|
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2014-12-15 15:07:41 -05:00
|
|
|
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
2015-01-19 12:35:40 -05:00
|
|
|
local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
if [ $cword -eq $counter ]; then
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2013-10-15 05:02:31 -04:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_save() {
|
2014-12-29 13:21:45 -05:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--output|-o)
|
2014-12-29 13:21:45 -05:00
|
|
|
_filedir
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
|
2014-12-29 13:21:45 -05:00
|
|
|
;;
|
|
|
|
*)
|
2015-07-30 10:09:24 -04:00
|
|
|
__docker_images
|
2014-12-29 13:21:45 -05:00
|
|
|
;;
|
|
|
|
esac
|
2014-01-11 03:00:03 -05:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_search() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--stars|-s)
|
2014-01-11 03:00:03 -05:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_start() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_stopped
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2015-01-26 14:01:40 -05:00
|
|
|
_docker_stats() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-02-13 11:45:04 -05:00
|
|
|
COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) )
|
2015-03-17 12:06:23 -04:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_running
|
|
|
|
;;
|
|
|
|
esac
|
2015-01-26 14:01:40 -05:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_stop() {
|
2013-10-15 05:02:31 -04:00
|
|
|
case "$prev" in
|
2014-12-30 13:18:21 -05:00
|
|
|
--time|-t)
|
2013-10-15 05:02:31 -04:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
|
2013-10-15 05:02:31 -04:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_running
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_tag() {
|
2014-01-11 03:00:03 -05:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
2015-03-17 12:06:23 -04:00
|
|
|
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
|
2014-01-11 03:00:03 -05:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
(( counter++ ))
|
|
|
|
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_image_repos_and_tags
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_unpause() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_unpauseable
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2014-10-02 13:01:10 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_top() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
local counter=$(__docker_pos_first_nonflag)
|
|
|
|
if [ $cword -eq $counter ]; then
|
|
|
|
__docker_containers_running
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_version() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2015-09-07 16:18:29 -04:00
|
|
|
_docker_volume_create() {
|
|
|
|
case "$prev" in
|
|
|
|
--driver|-d)
|
|
|
|
COMPREPLY=( $( compgen -W "local" -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--name|--opt|-o)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--driver -d --help --name --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_volumes
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_volume_ls() {
|
|
|
|
case "$prev" in
|
|
|
|
--filter|-f)
|
|
|
|
COMPREPLY=( $( compgen -W "dangling=true" -- "$cur" ) )
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_volume_rm() {
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_volumes
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
_docker_volume() {
|
2015-10-11 09:32:47 -04:00
|
|
|
local subcommands="
|
2015-09-07 16:18:29 -04:00
|
|
|
create
|
|
|
|
inspect
|
|
|
|
ls
|
|
|
|
rm
|
2015-10-11 09:32:47 -04:00
|
|
|
"
|
|
|
|
__docker_subcommands "$subcommands" && return
|
2015-09-07 16:18:29 -04:00
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
2015-10-11 09:32:47 -04:00
|
|
|
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
|
2015-09-07 16:18:29 -04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker_wait() {
|
2015-03-17 12:06:23 -04:00
|
|
|
case "$cur" in
|
|
|
|
-*)
|
|
|
|
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__docker_containers_all
|
|
|
|
;;
|
|
|
|
esac
|
2013-10-15 05:02:31 -04:00
|
|
|
}
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
_docker() {
|
2015-01-19 12:35:40 -05:00
|
|
|
local previous_extglob_setting=$(shopt -p extglob)
|
|
|
|
shopt -s extglob
|
|
|
|
|
2014-10-02 17:13:37 -04:00
|
|
|
local commands=(
|
|
|
|
attach
|
|
|
|
build
|
|
|
|
commit
|
|
|
|
cp
|
|
|
|
create
|
2015-06-14 15:03:41 -04:00
|
|
|
daemon
|
2014-10-02 17:13:37 -04:00
|
|
|
diff
|
|
|
|
events
|
|
|
|
exec
|
|
|
|
export
|
|
|
|
history
|
|
|
|
images
|
|
|
|
import
|
|
|
|
info
|
|
|
|
inspect
|
|
|
|
kill
|
|
|
|
load
|
|
|
|
login
|
2015-03-17 12:06:23 -04:00
|
|
|
logout
|
2014-10-02 17:13:37 -04:00
|
|
|
logs
|
2015-10-11 11:08:44 -04:00
|
|
|
network
|
2014-10-02 17:13:37 -04:00
|
|
|
pause
|
|
|
|
port
|
|
|
|
ps
|
|
|
|
pull
|
|
|
|
push
|
2015-02-18 14:49:05 -05:00
|
|
|
rename
|
2014-10-02 17:13:37 -04:00
|
|
|
restart
|
|
|
|
rm
|
|
|
|
rmi
|
|
|
|
run
|
|
|
|
save
|
|
|
|
search
|
|
|
|
start
|
2015-01-26 14:01:40 -05:00
|
|
|
stats
|
2014-10-02 17:13:37 -04:00
|
|
|
stop
|
|
|
|
tag
|
|
|
|
top
|
|
|
|
unpause
|
|
|
|
version
|
2015-09-07 16:18:29 -04:00
|
|
|
volume
|
2014-10-02 17:13:37 -04:00
|
|
|
wait
|
|
|
|
)
|
2013-10-15 05:02:31 -04:00
|
|
|
|
2015-07-31 14:02:03 -04:00
|
|
|
# These options are valid as global options for all client commands
|
|
|
|
# and valid as command options for `docker daemon`
|
|
|
|
local global_boolean_options="
|
|
|
|
--debug -D
|
|
|
|
--tls
|
|
|
|
--tlsverify
|
|
|
|
"
|
2015-06-14 15:03:41 -04:00
|
|
|
local global_options_with_args="
|
2015-08-03 12:53:51 -04:00
|
|
|
--config
|
2015-01-19 12:35:40 -05:00
|
|
|
--host -H
|
|
|
|
--log-level -l
|
|
|
|
--tlscacert
|
|
|
|
--tlscert
|
|
|
|
--tlskey
|
|
|
|
"
|
|
|
|
|
2015-08-03 12:53:51 -04:00
|
|
|
local host config
|
2015-01-19 12:35:40 -05:00
|
|
|
|
2013-10-15 05:02:31 -04:00
|
|
|
COMPREPLY=()
|
2014-01-11 03:00:03 -05:00
|
|
|
local cur prev words cword
|
2013-10-15 05:02:31 -04:00
|
|
|
_get_comp_words_by_ref -n : cur prev words cword
|
|
|
|
|
2015-10-11 09:32:47 -04:00
|
|
|
local command='docker' command_pos=0 subcommand_pos
|
2014-01-11 03:00:03 -05:00
|
|
|
local counter=1
|
2013-10-15 05:02:31 -04:00
|
|
|
while [ $counter -lt $cword ]; do
|
2014-01-11 03:00:03 -05:00
|
|
|
case "${words[$counter]}" in
|
2015-05-13 16:39:25 -04:00
|
|
|
# save host so that completion can use custom daemon
|
|
|
|
--host|-H)
|
|
|
|
(( counter++ ))
|
|
|
|
host="${words[$counter]}"
|
|
|
|
;;
|
2015-08-03 12:53:51 -04:00
|
|
|
# save config so that completion can use custom configuration directories
|
|
|
|
--config)
|
|
|
|
(( counter++ ))
|
|
|
|
config="${words[$counter]}"
|
|
|
|
;;
|
2015-06-14 15:03:41 -04:00
|
|
|
$(__docker_to_extglob "$global_options_with_args") )
|
2013-10-15 05:02:31 -04:00
|
|
|
(( counter++ ))
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
;;
|
2015-05-28 11:06:47 -04:00
|
|
|
=)
|
|
|
|
(( counter++ ))
|
|
|
|
;;
|
2013-10-15 05:02:31 -04:00
|
|
|
*)
|
2014-01-11 03:00:03 -05:00
|
|
|
command="${words[$counter]}"
|
2015-07-13 12:06:22 -04:00
|
|
|
command_pos=$counter
|
2013-10-15 05:02:31 -04:00
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
(( counter++ ))
|
|
|
|
done
|
|
|
|
|
|
|
|
local completions_func=_docker_${command}
|
|
|
|
declare -F $completions_func >/dev/null && $completions_func
|
|
|
|
|
2015-01-19 12:35:40 -05:00
|
|
|
eval "$previous_extglob_setting"
|
2013-10-15 05:02:31 -04:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
complete -F _docker docker
|