2013-10-15 05:02:31 -04:00
#!bash
#
# bash completion file for core docker commands
#
# This script provides supports completion of:
# - 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
# - copy this file and add the line below to your .bashrc after
# bash completion features are loaded
# . docker.bash
#
# 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-01-20 03:26:01 -05:00
__docker_q() {
docker 2>/dev/null "$@"
}
2013-10-15 05:02:31 -04:00
__docker_containers_all()
{
2014-01-20 03:26:01 -05:00
local containers="$( __docker_q ps -a -q )"
local names="$( __docker_q inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
}
__docker_containers_running()
{
2014-01-20 03:26:01 -05:00
local containers="$( __docker_q ps -q )"
local names="$( __docker_q inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
}
__docker_containers_stopped()
{
2014-01-20 03:26:01 -05:00
local containers="$( { __docker_q ps -a -q; __docker_q ps -q; } | sort | uniq -u )"
local names="$( __docker_q inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
}
__docker_image_repos()
{
2014-01-20 03:26:01 -05:00
local repos="$( __docker_q images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
2013-10-15 05:02:31 -04:00
COMPREPLY=( $( compgen -W "$repos" -- "$cur" ) )
}
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags()
2013-10-15 05:02:31 -04:00
{
2014-01-20 03:26:01 -05:00
local repos="$( __docker_q images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( __docker_q images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "$repos $images" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
__ltrim_colon_completions "$cur"
}
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags_and_ids()
2013-10-15 05:02:31 -04:00
{
2014-01-20 03:26:01 -05:00
local repos="$( __docker_q images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( __docker_q images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
local ids="$( __docker_q images -a -q )"
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "$repos $images $ids" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
__ltrim_colon_completions "$cur"
}
__docker_containers_and_images()
{
2014-01-20 03:26:01 -05:00
local containers="$( __docker_q ps -a -q )"
local names="$( __docker_q inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
local repos="$( __docker_q images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( __docker_q images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
local ids="$( __docker_q images -a -q )"
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "$containers $names $repos $images $ids" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
__ltrim_colon_completions "$cur"
}
2014-01-11 03:00:03 -05:00
__docker_pos_first_nonflag()
{
local argument_flags=$1
local counter=$cpos
while [ $counter -le $cword ]; do
if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
(( counter++ ))
else
case "${words[$counter]}" in
-*)
;;
*)
break
;;
esac
fi
(( counter++ ))
done
echo $counter
}
2013-10-15 05:02:31 -04:00
_docker_docker()
{
case "$prev" in
-H)
return
;;
*)
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-H" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$commands help" -- "$cur" ) )
;;
esac
}
_docker_attach()
{
2014-01-11 03:00:03 -05:00
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$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
}
_docker_build()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--tag)
__docker_image_repos_and_tags
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-08-31 16:08:28 -04:00
COMPREPLY=( $( compgen -W "-t --tag -q --quiet --no-cache --rm --force-rm" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter="$(__docker_pos_first_nonflag '-t|--tag')"
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
}
_docker_commit()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-m|--message|-a|--author|--run)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-m --message -a --author --run" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag '-m|--message|-a|--author|--run')
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
}
_docker_cp()
{
2014-01-11 03:00:03 -05:00
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++ ))
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
_filedir
2014-01-11 03:00:03 -05:00
return
2013-10-15 05:02:31 -04:00
fi
}
2014-08-11 13:12:09 -04:00
_docker_create()
{
case "$prev" in
-a|--attach)
COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
return
;;
--cidfile|--env-file)
_filedir
return
;;
--volumes-from)
__docker_containers_all
return
;;
-v|--volume)
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
return
;;
-e|--env)
COMPREPLY=( $( compgen -e -- "$cur" ) )
compopt -o nospace
return
;;
--link)
case "$cur" in
*:*)
;;
*)
__docker_containers_running
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
compopt -o nospace
;;
esac
return
;;
--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|-c|--cpu-shares|-n|--name|-p|--publish|--expose|--dns|--lxc-conf)
return
;;
*)
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-n --networking --privileged -P --publish-all -i --interactive -t --tty --cidfile --entrypoint -h --hostname -m --memory -u --user -w --workdir -c --cpu-shares --name -a --attach -v --volume --link -e --env -p --publish --expose --dns --volumes-from --lxc-conf" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--cidfile|--volumes-from|-v|--volume|-e|--env|--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|-c|--cpu-shares|-n|--name|-a|--attach|--link|-p|--publish|--expose|--dns|--lxc-conf')
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags_and_ids
fi
;;
esac
}
2013-10-15 05:02:31 -04:00
_docker_diff()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
__docker_containers_all
fi
}
_docker_events()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
--since)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2013-12-23 14:43:54 -05:00
COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
;;
esac
}
2014-09-16 14:46:24 -04:00
_docker_exec()
{
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-d --detach -i --interactive -t --tty" -- "$cur" ) )
;;
*)
__docker_containers_running
;;
esac
}
2013-10-15 05:02:31 -04:00
_docker_export()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
__docker_containers_all
fi
}
_docker_help()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) )
fi
}
_docker_history()
{
2014-01-11 03:00:03 -05:00
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-q --quiet --no-trunc" -- "$cur" ) )
;;
*)
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
}
_docker_images()
{
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-q --quiet -a --all --no-trunc -v --viz -t --tree" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
__docker_image_repos
fi
;;
esac
}
_docker_import()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
return
fi
(( counter++ ))
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags
return
fi
2013-10-15 05:02:31 -04:00
}
_docker_info()
{
return
}
_docker_inspect()
{
2014-01-11 03:00:03 -05:00
case "$prev" in
-f|--format)
return
;;
*)
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-f --format" -- "$cur" ) )
;;
*)
__docker_containers_and_images
;;
esac
2013-10-15 05:02:31 -04:00
}
_docker_kill()
{
__docker_containers_running
}
2014-01-11 03:00:03 -05:00
_docker_load()
{
return
}
2013-10-15 05:02:31 -04:00
_docker_login()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-u|--username|-p|--password|-e|--email)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-u --username -p --password -e --email" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
;;
esac
}
_docker_logs()
{
2014-01-11 03:00:03 -05:00
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-f --follow" -- "$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
}
_docker_port()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
__docker_containers_all
fi
}
_docker_ps()
{
case "$prev" in
2014-03-18 13:38:56 -04:00
--since|--before)
2014-06-19 12:11:32 -04:00
__docker_containers_all
2014-01-11 03:00:03 -05:00
;;
-n)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-03-18 13:38:56 -04:00
COMPREPLY=( $( compgen -W "-q --quiet -s --size -a --all --no-trunc -l --latest --since --before -n" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
;;
esac
}
_docker_pull()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--tag)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --tag" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag '-t|--tag')
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags
fi
2013-10-15 05:02:31 -04:00
;;
esac
}
_docker_push()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2014-06-19 12:11:32 -04:00
__docker_image_repos_and_tags
2014-01-11 03:00:03 -05:00
fi
2013-10-15 05:02:31 -04:00
}
_docker_restart()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--time)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
__docker_containers_all
;;
esac
}
_docker_rm()
{
case "$cur" in
-*)
2014-06-26 00:12:25 -04:00
COMPREPLY=( $( compgen -W "-f --force -l --link -v --volumes" -- "$cur" ) )
return
2013-10-15 05:02:31 -04:00
;;
*)
2014-06-26 00:12:25 -04:00
local force=
for arg in "${COMP_WORDS[@]}"; do
case "$arg" in
-f|--force)
__docker_containers_all
return
;;
esac
done
2013-10-15 05:02:31 -04:00
__docker_containers_stopped
2014-06-26 00:12:25 -04:00
return
2013-10-15 05:02:31 -04:00
;;
esac
}
_docker_rmi()
{
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags_and_ids
2013-10-15 05:02:31 -04:00
}
_docker_run()
{
case "$prev" in
2014-06-29 01:09:23 -04:00
-a|--attach)
COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
return
;;
--cidfile|--env-file)
2013-10-15 05:02:31 -04:00
_filedir
2014-06-29 01:09:23 -04:00
return
2013-10-15 05:02:31 -04:00
;;
2013-12-23 14:43:54 -05:00
--volumes-from)
2013-10-15 05:02:31 -04:00
__docker_containers_all
2014-06-29 01:09:23 -04:00
return
2013-10-15 05:02:31 -04:00
;;
2014-01-11 03:00:03 -05:00
-v|--volume)
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
;;
-e|--env)
COMPREPLY=( $( compgen -e -- "$cur" ) )
2014-06-29 01:09:23 -04:00
compopt -o nospace
return
;;
--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
;;
2014-09-16 14:46:24 -04:00
--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|--cpuset|-c|--cpu-shares|-n|--name|-p|--publish|--expose|--dns|--lxc-conf)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-09-16 14:46:24 -04:00
COMPREPLY=( $( compgen -W "--rm -d --detach -n --networking --privileged -P --publish-all -i --interactive -t --tty --cidfile --entrypoint -h --hostname -m --memory -u --user -w --workdir --cpuset -c --cpu-shares --sig-proxy --name -a --attach -v --volume --link -e --env -p --publish --expose --dns --volumes-from --lxc-conf" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
2014-09-16 14:46:24 -04:00
local counter=$(__docker_pos_first_nonflag '--cidfile|--volumes-from|-v|--volume|-e|--env|--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|--cpuset|-c|--cpu-shares|-n|--name|-a|--attach|--link|-p|--publish|--expose|--dns|--lxc-conf')
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-01-11 03:00:03 -05:00
_docker_save()
{
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags_and_ids
fi
}
2013-10-15 05:02:31 -04:00
_docker_search()
{
2014-01-11 03:00:03 -05:00
case "$prev" in
-s|--stars)
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-06-02 14:48:58 -04:00
COMPREPLY=( $( compgen -W "--no-trunc --automated -s --stars" -- "$cur" ) )
2014-01-11 03:00:03 -05:00
;;
*)
;;
esac
2013-10-15 05:02:31 -04:00
}
_docker_start()
{
2014-01-11 03:00:03 -05:00
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-a --attach -i --interactive" -- "$cur" ) )
;;
*)
__docker_containers_stopped
;;
esac
2013-10-15 05:02:31 -04:00
}
_docker_stop()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--time)
2013-10-15 05:02:31 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
2013-10-15 05:02:31 -04:00
;;
*)
__docker_containers_running
;;
esac
}
_docker_tag()
{
2014-01-11 03:00:03 -05:00
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-f --force" -- "$cur" ) )
;;
*)
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
}
_docker_top()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-10-15 05:02:31 -04:00
__docker_containers_running
fi
}
_docker_version()
{
return
}
_docker_wait()
{
__docker_containers_all
}
_docker()
{
local commands="
attach
build
commit
cp
2014-08-11 13:12:09 -04:00
create
2013-10-15 05:02:31 -04:00
diff
events
2014-09-16 14:46:24 -04:00
exec
2013-10-15 05:02:31 -04:00
export
history
images
import
info
insert
inspect
kill
2014-01-11 03:00:03 -05:00
load
2013-10-15 05:02:31 -04:00
login
logs
port
ps
pull
push
restart
rm
rmi
run
2014-01-11 03:00:03 -05:00
save
2013-10-15 05:02:31 -04:00
search
start
stop
tag
top
version
wait
"
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
2014-01-11 03:00:03 -05:00
local command='docker'
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
2013-10-15 05:02:31 -04:00
-H)
(( counter++ ))
;;
-*)
;;
*)
2014-01-11 03:00:03 -05:00
command="${words[$counter]}"
2013-10-15 05:02:31 -04:00
cpos=$counter
(( cpos++ ))
break
;;
esac
(( counter++ ))
done
local completions_func=_docker_${command}
declare -F $completions_func >/dev/null && $completions_func
return 0
}
complete -F _docker docker