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
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-05-13 16:39:25 -04:00
docker ${host:+-H "$host"} 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") )
}
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_image_repos_and_tags_and_ids() {
local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
COMPREPLY=( $(compgen -W "$images" -- "$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[@]}" )
__docker_image_repos_and_tags_and_ids
COMPREPLY+=( "${containers[@]}" )
2013-10-15 05:02:31 -04:00
}
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-07-13 12:06:22 -04:00
local counter=$((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() {
local option_glob=$1
local counter=$((command_pos + 1))
while [ $counter -lt $cword ]; do
case ${words[$counter]} in
$option_glob )
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)"
}
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-07-23 08:19:13 -04:00
local fluentd_options="fluentd-address fluentd-tag"
local gelf_options="gelf-address gelf-tag"
local syslog_options="syslog-address syslog-facility syslog-tag"
2015-07-13 11:28:25 -04:00
case $(__docker_value_of_option --log-driver) in
2015-07-23 08:19:13 -04:00
'')
COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $syslog_options" -S = -- "$cur" ) )
;;
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
;;
syslog)
2015-07-23 08:19:13 -04:00
COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
2015-07-13 11:28:25 -04:00
;;
*)
return
;;
esac
compopt -o nospace
}
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#=}" ) )
compopt -o nospace
return
;;
*syslog-address=*)
COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
compopt -o nospace
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-01-19 12:35:40 -05:00
--help -h
--version -v
"
2013-10-15 05:02:31 -04:00
case "$prev" in
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
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
-*)
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() {
2013-10-15 05:02:31 -04:00
case "$prev" in
2015-05-28 11:06:47 -04:00
--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap)
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
;;
2013-10-15 05:02:31 -04:00
esac
case "$cur" in
-*)
2015-07-22 22:26:06 -04:00
COMPREPLY=( $( compgen -W "--cgroup-parent --cpuset-cpus --cpuset-mems --cpu-shares -c --cpu-period --cpu-quota --file -f --force-rm --help --memory -m --memory-swap --no-cache --pull --quiet -q --rm --tag -t --ulimit" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2015-05-28 11:06:47 -04:00
local counter="$(__docker_pos_first_nonflag '--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--file|-f|--memory|-m|--memory-swap|--tag|-t')"
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
;;
*)
__docker_containers_all
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
compopt -o nospace
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-03-18 13:10:51 -04:00
_filedir -d
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-06-14 15:03:41 -04:00
--help -h
--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
--default-gateway
--default-gateway-v6
--default-ulimit
--dns
--dns-search
--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
--exec-root|--graph|-g)
_filedir -d
return
;;
--log-driver)
__docker_log_drivers
return
;;
--pidfile|-p|--tlscacert|--tlscert|--tlskey)
_filedir
return
;;
--storage-driver|-s)
COMPREPLY=( $( compgen -W "aufs devicemapper btrfs overlay" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
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
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" ) )
compopt -o nospace
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#=}"
__docker_image_repos_and_tags_and_ids
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-05-26 17:02:10 -04:00
COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i -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
__docker_image_repos_and_tags_and_ids
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
compopt -o nospace
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-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
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-06-26 10:47:31 -04:00
COMPREPLY=( $( compgen -W "--format -f --type --help" -- "$cur" ) )
2014-01-11 03:00:03 -05:00
;;
*)
__docker_containers_and_images
;;
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
_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-03-29 12:24:08 -04:00
COMPREPLY=( $( compgen -S = -W "exited id label name status" -- "$cur" ) )
2015-03-17 12:06:23 -04:00
compopt -o nospace
return
;;
2014-01-11 03:00:03 -05:00
-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-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-03-17 12:06:23 -04:00
COMPREPLY=( $( compgen -W "--all -a --before --filter -f --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" ) )
;;
*)
__docker_image_repos_and_tags_and_ids
;;
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
2015-05-28 11:06:47 -04:00
--blkio-weight
2014-12-30 13:18:21 -05:00
--attach -a
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
--cpuset
2015-04-08 04:58:59 -04:00
--cpu-period
2015-04-20 11:16:47 -04:00
--cpu-quota
2015-05-28 11:06:47 -04:00
--cpu-shares -c
2014-12-15 15:07:41 -05:00
--device
--dns
--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-03-24 08:15:16 -04:00
--label -l
--label-file
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
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
2014-12-30 13:18:21 -05:00
--user -u
2015-03-09 08:36:09 -04:00
--ulimit
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
"
local all_options="$options_with_args
2015-03-06 02:13:27 -05:00
--help
2014-12-30 13:18:21 -05:00
--interactive -i
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
"
[ "$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
--sig-proxy
"
2015-01-19 12:35:40 -05:00
local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
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" ) )
compopt -o nospace
;;
/*)
_filedir
compopt -o nospace
;;
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" ) )
2014-06-29 01:09:23 -04:00
compopt -o nospace
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
compopt -o nospace
fi
;;
esac
return
;;
2014-06-29 01:09:23 -04:00
--link)
case "$cur" in
*:*)
;;
*)
__docker_containers_running
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
compopt -o nospace
;;
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
compopt -o nospace
fi
;;
esac
return
;;
--restart)
case "$cur" in
on-failure:*)
;;
*)
COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
;;
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
compopt -o nospace
fi
;;
*)
COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
compopt -o nospace
;;
esac
return
;;
2014-12-30 13:18:21 -05:00
--volumes-from)
__docker_containers_all
return
;;
2015-01-19 12:35:40 -05:00
$options_with_args_glob )
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" ) )
2013-10-15 05:02:31 -04:00
2014-01-11 03:00:03 -05:00
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags_and_ids
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
;;
*)
__docker_image_repos_and_tags_and_ids
;;
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
}
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
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
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-01-19 12:35:40 -05:00
--host -H
--log-level -l
--tlscacert
--tlscert
--tlskey
"
2015-05-13 16:39:25 -04:00
local host
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-07-13 12:06:22 -04:00
local command='docker' command_pos=0
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-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