2013-08-09 21:38:11 -04:00
#!bash
2013-08-10 08:05:31 -04:00
#
# 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-08-10 08:05: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:
2013-08-10 20:08:47 -04:00
# Currently, the completions will not work if the docker daemon is not
# bound to the default communication port/socket
2013-08-10 08:05:31 -04:00
# 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
2013-08-09 21:38:11 -04:00
2013-08-13 21:45:03 -04:00
__docker_containers_all()
2013-08-09 21:38:11 -04:00
{
2014-01-11 03:00:03 -05:00
local containers="$( docker ps -a -q )"
local names="$( docker inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
}
2013-08-13 21:45:03 -04:00
__docker_containers_running()
{
2014-01-11 03:00:03 -05:00
local containers="$( docker ps -q )"
local names="$( docker inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-08-13 21:45:03 -04:00
}
__docker_containers_stopped()
{
2014-01-11 03:00:03 -05:00
local containers="$( { docker ps -a -q; docker ps -q; } | sort | uniq -u )"
local names="$( docker inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
2013-12-30 20:09:42 -05:00
COMPREPLY=( $( compgen -W "$names $containers" -- "$cur" ) )
2013-08-13 21:45:03 -04:00
}
2013-08-09 21:38:11 -04:00
__docker_image_repos()
{
2014-01-11 03:00:03 -05:00
local repos="$( docker images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
2013-08-09 21:38:11 -04:00
COMPREPLY=( $( compgen -W "$repos" -- "$cur" ) )
}
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags()
2013-08-09 21:38:11 -04:00
{
2014-01-11 03:00:03 -05:00
local repos="$( docker images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( docker images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
COMPREPLY=( $( compgen -W "$repos $images" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
__ltrim_colon_completions "$cur"
}
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags_and_ids()
2013-08-09 21:38:11 -04:00
{
2014-01-11 03:00:03 -05:00
local repos="$( docker images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( docker images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
local ids="$( docker images -a -q )"
COMPREPLY=( $( compgen -W "$repos $images $ids" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
__ltrim_colon_completions "$cur"
}
__docker_containers_and_images()
{
2014-01-11 03:00:03 -05:00
local containers="$( docker ps -a -q )"
local names="$( docker inspect --format '{{.Name}}' $containers | sed 's,^/,,' )"
local repos="$( docker images | awk 'NR>1{print $1}' | grep -v '^<none>$' )"
local images="$( docker images | awk 'NR>1{print $1":"$2}' | grep -v '^<none>:' )"
local ids="$( docker images -a -q )"
COMPREPLY=( $( compgen -W "$containers $names $repos $images $ids" -- "$cur" ) )
2013-08-09 21:38:11 -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-08-09 21:38:11 -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-08-09 21:38:11 -04:00
}
_docker_build()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--tag)
__docker_image_repos_and_tags
2013-08-09 21:38:11 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --tag -q --quiet --no-cache --rm" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter="$(__docker_pos_first_nonflag '-t|--tag')"
if [ $cword -eq $counter ]; then
_filedir
fi
2013-08-09 21:38:11 -04:00
;;
esac
}
_docker_commit()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-m|--message|-a|--author|--run)
2013-08-09 21:38:11 -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-08-09 21:38:11 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag '-m|--message|-a|--author|--run')
2013-08-24 13:04:40 -04:00
2014-01-11 03:00:03 -05:00
if [ $cword -eq $counter ]; then
2013-08-24 13:04:40 -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-08-24 13:04:40 -04:00
fi
2013-08-09 21:38:11 -04:00
;;
esac
}
2013-08-24 13:04:40 -04:00
_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-08-24 13:04:40 -04:00
_filedir
2014-01-11 03:00:03 -05:00
return
2013-08-24 13:04:40 -04:00
fi
}
2013-08-09 21:38:11 -04:00
_docker_diff()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
fi
}
_docker_events()
{
2013-08-24 13:04:40 -04:00
case "$prev" in
2014-01-11 03:00:03 -05:00
--since)
2013-08-24 13:04:40 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2013-12-23 14:43:54 -05:00
COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
2013-08-24 13:04:40 -04:00
;;
*)
;;
esac
2013-08-09 21:38:11 -04:00
}
_docker_export()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
fi
}
_docker_help()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-09 21:38:11 -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-08-09 21:38:11 -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-08-09 21:38:11 -04:00
;;
*)
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-09 21:38:11 -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-08-09 21:38:11 -04:00
}
_docker_info()
{
return
}
_docker_insert()
{
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
2013-08-09 21:38:11 -04:00
fi
}
_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-08-09 21:38:11 -04:00
}
_docker_kill()
{
2013-08-13 21:45:03 -04:00
__docker_containers_running
2013-08-09 21:38:11 -04:00
}
2014-01-11 03:00:03 -05:00
_docker_load()
{
return
}
2013-08-09 21:38:11 -04:00
_docker_login()
{
2013-08-24 13:04:40 -04:00
case "$prev" in
2014-01-11 03:00:03 -05:00
-u|--username|-p|--password|-e|--email)
2013-08-24 13:04:40 -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-08-24 13:04:40 -04:00
;;
*)
;;
esac
2013-08-09 21:38:11 -04:00
}
_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-08-09 21:38:11 -04:00
}
_docker_port()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
fi
}
_docker_ps()
{
2013-08-24 13:04:40 -04:00
case "$prev" in
2014-01-11 03:00:03 -05:00
--since-id|--before-id)
COMPREPLY=( $( compgen -W "$(docker ps -a -q)" -- "$cur" ) )
# TODO replace this with __docker_containers_all
# see https://github.com/dotcloud/docker/issues/3565
return
;;
-n)
2013-08-24 13:04:40 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-q --quiet -s --size -a --all --no-trunc -l --latest --since-id --before-id -n" -- "$cur" ) )
2013-08-24 13:04:40 -04:00
;;
*)
;;
esac
2013-08-09 21:38:11 -04:00
}
_docker_pull()
{
2013-08-24 13:04:40 -04:00
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--tag)
2013-08-24 13:04:40 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --tag" -- "$cur" ) )
2013-08-24 13:04:40 -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-08-24 13:04:40 -04:00
;;
esac
2013-08-09 21:38:11 -04:00
}
_docker_push()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
__docker_image_repos
# TODO replace this with __docker_image_repos_and_tags
# see https://github.com/dotcloud/docker/issues/3411
fi
2013-08-09 21:38:11 -04:00
}
_docker_restart()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--time)
2013-08-09 21:38:11 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
;;
*)
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
;;
esac
}
_docker_rm()
{
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-v --volumes -l --link" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
;;
*)
2013-08-13 21:45:03 -04:00
__docker_containers_stopped
2013-08-09 21:38:11 -04:00
;;
esac
}
_docker_rmi()
{
2014-01-11 03:00:03 -05:00
__docker_image_repos_and_tags_and_ids
2013-08-09 21:38:11 -04:00
}
_docker_run()
{
case "$prev" in
2013-12-23 14:43:54 -05:00
--cidfile)
2013-08-09 21:38:11 -04:00
_filedir
;;
2013-12-23 14:43:54 -05:00
--volumes-from)
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
;;
2014-01-11 03:00:03 -05:00
-v|--volume)
# TODO something magical with colons and _filedir ?
return
;;
-e|--env)
COMPREPLY=( $( compgen -e -- "$cur" ) )
return
;;
2014-01-13 15:16:12 -05:00
--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|-c|--cpu-shares|-n|--name|-a|--attach|--link|-p|--publish|--expose|--dns|--lxc-conf)
2013-08-09 21:38:11 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-13 15:16:12 -05: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 -c --cpu-shares --sig-proxy --name -a --attach -v --volume --link -e --env -p --publish --expose --dns --volumes-from --lxc-conf" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
;;
*)
2014-01-13 15:16:12 -05:00
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')
2013-08-09 21:38:11 -04:00
2014-01-11 03:00:03 -05:00
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags_and_ids
2013-08-24 13:04:40 -04:00
fi
2013-08-09 21:38:11 -04:00
;;
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-08-09 21:38:11 -04:00
_docker_search()
{
2014-01-11 03:00:03 -05:00
case "$prev" in
-s|--stars)
return
;;
*)
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--no-trunc -t --trusted -s --stars" -- "$cur" ) )
;;
*)
;;
esac
2013-08-09 21:38:11 -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-08-09 21:38:11 -04:00
}
_docker_stop()
{
case "$prev" in
2014-01-11 03:00:03 -05:00
-t|--time)
2013-08-09 21:38:11 -04:00
return
;;
*)
;;
esac
case "$cur" in
-*)
2014-01-11 03:00:03 -05:00
COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
2013-08-09 21:38:11 -04:00
;;
*)
2013-08-13 21:45:03 -04:00
__docker_containers_running
2013-08-09 21:38:11 -04:00
;;
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-08-09 21:38:11 -04:00
}
_docker_top()
{
2014-01-11 03:00:03 -05:00
local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
2013-08-13 21:45:03 -04:00
__docker_containers_running
2013-08-09 21:38:11 -04:00
fi
}
_docker_version()
{
return
}
_docker_wait()
{
2013-08-13 21:45:03 -04:00
__docker_containers_all
2013-08-09 21:38:11 -04:00
}
_docker()
{
local commands="
attach
build
commit
2013-08-24 13:04:40 -04:00
cp
2013-08-09 21:38:11 -04:00
diff
events
export
history
images
import
info
insert
inspect
kill
2014-01-11 03:00:03 -05:00
load
2013-08-09 21:38:11 -04:00
login
logs
port
ps
pull
push
restart
rm
rmi
run
2014-01-11 03:00:03 -05:00
save
2013-08-09 21:38:11 -04:00
search
start
stop
tag
top
version
wait
"
COMPREPLY=()
2014-01-11 03:00:03 -05:00
local cur prev words cword
2013-08-09 21:38:11 -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-08-09 21:38:11 -04:00
while [ $counter -lt $cword ]; do
2014-01-11 03:00:03 -05:00
case "${words[$counter]}" in
2013-08-09 21:38:11 -04:00
-H)
(( counter++ ))
;;
-*)
;;
*)
2014-01-11 03:00:03 -05:00
command="${words[$counter]}"
2013-08-09 21:38:11 -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