From d6e5c2c276de458f36034d46f7b7f0f8efd24491 Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sat, 10 Aug 2013 02:38:11 +0100 Subject: [PATCH 1/5] Add initial bash completion script The script can be used to auto-complete commands, image names and container ids from within a bash prompt. This partially resolves #336. --- contrib/docker.bash | 434 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 434 insertions(+) create mode 100644 contrib/docker.bash diff --git a/contrib/docker.bash b/contrib/docker.bash new file mode 100644 index 0000000000..dcabdf252c --- /dev/null +++ b/contrib/docker.bash @@ -0,0 +1,434 @@ +#!bash + +have docker && { +__docker_containers() +{ + local containers + containers="$( docker ps -a -q )" + COMPREPLY=( $( compgen -W "$containers" -- "$cur" ) ) +} + +__docker_image_repos() +{ + local repos + repos="$( docker images | awk 'NR>1{print $1}' )" + COMPREPLY=( $( compgen -W "$repos" -- "$cur" ) ) +} + +__docker_images() +{ + local images + images="$( docker images | awk 'NR>1{print $1":"$2}' )" + COMPREPLY=( $( compgen -W "$images" -- "$cur" ) ) + __ltrim_colon_completions "$cur" +} + +__docker_image_repos_and_tags() +{ + local repos images + repos="$( docker images | awk 'NR>1{print $1}' )" + images="$( docker images | awk 'NR>1{print $1":"$2}' )" + COMPREPLY=( $( compgen -W "$repos $images" -- "$cur" ) ) + __ltrim_colon_completions "$cur" +} + +__docker_containers_and_images() +{ + local containers images + containers="$( docker ps -a -q )" + images="$( docker images | awk 'NR>1{print $1":"$2}' )" + COMPREPLY=( $( compgen -W "$images $containers" -- "$cur" ) ) + __ltrim_colon_completions "$cur" +} + +_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() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_build() +{ + case "$prev" in + -t) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-t -q" -- "$cur" ) ) + ;; + *) + _filedir + ;; + esac +} + +_docker_commit() +{ + case "$prev" in + -author|-m|-run) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-author -m -run" -- "$cur" ) ) + ;; + *) + __docker_containers + ;; + esac +} + +_docker_diff() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_events() +{ + COMPREPLY=( $( compgen -W "-since" -- "$cur" ) ) +} + +_docker_export() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_help() +{ + if [ $cpos -eq $cword ]; then + COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) ) + fi +} + +_docker_history() +{ + if [ $cpos -eq $cword ]; then + __docker_image_repos_and_tags + fi +} + +_docker_images() +{ + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-a -notrunc -q -viz" -- "$cur" ) ) + ;; + *) + local counter=$cpos + while [ $counter -le $cword ]; do + case "${words[$counter]}" in + -*) + ;; + *) + break + ;; + esac + (( counter++ )) + done + + if [ $counter -eq $cword ]; then + __docker_image_repos + fi + ;; + esac +} + +_docker_import() +{ + return +} + +_docker_info() +{ + return +} + +_docker_insert() +{ + if [ $cpos -eq $cword ]; then + __docker_image_repos_and_tags + fi +} + +_docker_inspect() +{ + __docker_containers_and_images +} + +_docker_kill() +{ + __docker_containers +} + +_docker_login() +{ + COMPREPLY=( $( compgen -W "-e -p -u" -- "$cur" ) ) +} + +_docker_logs() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_port() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_ps() +{ + COMPREPLY=( $( compgen -W "-a -beforeId -l -n -notrunc -q -s -sinceId" -- "$cur" ) ) +} + +_docker_pull() +{ + COMPREPLY=( $( compgen -W "-t" -- "$cur" ) ) +} + +_docker_push() +{ + return +} + +_docker_restart() +{ + case "$prev" in + -t) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-t" -- "$cur" ) ) + ;; + *) + __docker_containers + ;; + esac +} + +_docker_rm() +{ + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-v" -- "$cur" ) ) + ;; + *) + __docker_containers + ;; + esac +} + +_docker_rmi() +{ + __docker_image_repos_and_tags +} + +_docker_run() +{ + case "$prev" in + -cidfile) + _filedir + ;; + -volumes-from) + __docker_containers + ;; + -a|-c|-dns|-e|-h|-m|-p|-u|-v) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-a -c -cidfile -d -dns -e -entrypoint -h -i -m -n -p -t -u -v -volumes-from" -- "$cur" ) ) + ;; + *) + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-a -notrunc -q -viz" -- "$cur" ) ) + ;; + *) + local counter=$cpos + while [ $counter -le $cword ]; do + case "${words[$counter]}" in + -a|-c|-cidfile|-dns|-e|-h|-m|-p|-u|-v|-volumes-from) + (( counter++ )) + ;; + -*) + ;; + *) + break + ;; + esac + (( counter++ )) + done + + if [ $counter -eq $cword ]; then + __docker_image_repos_and_tags + fi + ;; + esac + ;; + esac +} + +_docker_search() +{ + COMPREPLY=( $( compgen -W "-notrunc" -- "$cur" ) ) +} + +_docker_start() +{ + __docker_containers +} + +_docker_stop() +{ + case "$prev" in + -t) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-t" -- "$cur" ) ) + ;; + *) + __docker_containers + ;; + esac +} + +_docker_tag() +{ + COMPREPLY=( $( compgen -W "-f" -- "$cur" ) ) +} + +_docker_top() +{ + if [ $cpos -eq $cword ]; then + __docker_containers + fi +} + +_docker_version() +{ + return +} + +_docker_wait() +{ + __docker_containers +} + +_docker() +{ + local cur prev words cword command="docker" counter=1 word cpos + local commands=" + attach + build + commit + diff + events + export + history + images + import + info + insert + inspect + kill + login + logs + port + ps + pull + push + restart + rm + rmi + run + search + start + stop + tag + top + version + wait + " + + COMPREPLY=() + _get_comp_words_by_ref -n : cur prev words cword + + while [ $counter -lt $cword ]; do + word="${words[$counter]}" + case "$word" in + -H) + (( counter++ )) + ;; + -*) + ;; + *) + command="$word" + 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 +} \ No newline at end of file From 91ae1358966211826818ed452f13e3e2e27ed6cc Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sat, 10 Aug 2013 13:05:31 +0100 Subject: [PATCH 2/5] Add description and usage information --- contrib/docker.bash | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/contrib/docker.bash b/contrib/docker.bash index dcabdf252c..5a4a8e30a9 100644 --- a/contrib/docker.bash +++ b/contrib/docker.bash @@ -1,4 +1,23 @@ #!bash +# +# bash completion file for core docker commands +# +# This script provides supports completion of: +# - commands and their options +# - container ids +# - 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: +# 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 have docker && { __docker_containers() From d75282eb147218bb7c6f4032e75b95a1ddd299cf Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sun, 11 Aug 2013 00:57:18 +0100 Subject: [PATCH 3/5] Missed -entrypoint from 'docker run' options --- contrib/docker.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/docker.bash b/contrib/docker.bash index 5a4a8e30a9..a94ae2360f 100644 --- a/contrib/docker.bash +++ b/contrib/docker.bash @@ -293,7 +293,7 @@ _docker_run() -volumes-from) __docker_containers ;; - -a|-c|-dns|-e|-h|-m|-p|-u|-v) + -a|-c|-dns|-e|-entrypoint|-h|-m|-p|-u|-v) return ;; *) From ae1909b4823e500798f224a3ea70f7faf644a2bc Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sun, 11 Aug 2013 01:08:47 +0100 Subject: [PATCH 4/5] Clarified bash completion limitations --- contrib/docker.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/docker.bash b/contrib/docker.bash index a94ae2360f..1edabe1fe1 100644 --- a/contrib/docker.bash +++ b/contrib/docker.bash @@ -16,6 +16,8 @@ # . 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 From e737856a7f2c92f6cb582a12cc6f0b9fb4720d5a Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sun, 11 Aug 2013 01:29:22 +0100 Subject: [PATCH 5/5] Still missed -entrypoint from 'docker run' --- contrib/docker.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/docker.bash b/contrib/docker.bash index 1edabe1fe1..b9fb2ec6e0 100644 --- a/contrib/docker.bash +++ b/contrib/docker.bash @@ -315,7 +315,7 @@ _docker_run() local counter=$cpos while [ $counter -le $cword ]; do case "${words[$counter]}" in - -a|-c|-cidfile|-dns|-e|-h|-m|-p|-u|-v|-volumes-from) + -a|-c|-cidfile|-dns|-e|-entrypoint|-h|-m|-p|-u|-v|-volumes-from) (( counter++ )) ;; -*)