#compdef docker # # zsh completion for docker (http://docker.io) # # version: 0.2.2 # author: Felix Riedel # license: BSD License # github: https://github.com/felixr/docker-zsh-completion # __parse_docker_list() { sed -e '/^ID/d' -e 's/[ ]\{2,\}/|/g' -e 's/ \([hdwm]\)\(inutes\|ays\|ours\|eeks\)/\1/' | awk ' BEGIN {FS="|"} { printf("%s:%7s, %s\n", $1, $4, $2)}' } __docker_stoppedcontainers() { local expl declare -a stoppedcontainers stoppedcontainers=(${(f)"$(docker ps -a | grep --color=never 'Exit' | __parse_docker_list )"}) _describe -t containers-stopped "Stopped Containers" stoppedcontainers } __docker_runningcontainers() { local expl declare -a containers containers=(${(f)"$(docker ps | __parse_docker_list)"}) _describe -t containers-active "Running Containers" containers } __docker_containers () { __docker_stoppedcontainers __docker_runningcontainers } __docker_images () { local expl declare -a images images=(${(f)"$(docker images | awk '(NR > 1){printf("%s\\:%s\n", $1,$2)}')"}) images=($images ${(f)"$(docker images | awk '(NR > 1){printf("%s:%-15s in %s\n", $3,$2,$1)}')"}) _describe -t docker-images "Images" images } __docker_tags() { local expl declare -a tags tags=(${(f)"$(docker images | awk '(NR>1){print $2}'| sort | uniq)"}) _describe -t docker-tags "tags" tags } __docker_search() { # declare -a dockersearch local cache_policy zstyle -s ":completion:${curcontext}:" cache-policy cache_policy if [[ -z "$cache_policy" ]]; then zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy fi local searchterm cachename searchterm="${words[$CURRENT]%/}" cachename=_docker-search-$searchterm local expl local -a result if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ && ! _retrieve_cache ${cachename#_}; then _message "Searching for ${searchterm}..." result=(${(f)"$(docker search ${searchterm} | awk '(NR>2){print $1}')"}) _store_cache ${cachename#_} result fi _wanted dockersearch expl 'Available images' compadd -a result } __docker_caching_policy() { # oldp=( "$1"(Nmh+24) ) # 24 hour oldp=( "$1"(Nmh+1) ) # 24 hour (( $#oldp )) } __docker_repositories () { local expl declare -a repos repos=(${(f)"$(docker images | sed -e '1d' -e 's/[ ].*//' | sort | uniq)"}) _describe -t docker-repos "Repositories" repos } __docker_commands () { # local -a _docker_subcommands local cache_policy zstyle -s ":completion:${curcontext}:" cache-policy cache_policy if [[ -z "$cache_policy" ]]; then zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy fi if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands) \ && ! _retrieve_cache docker_subcommands; then _docker_subcommands=(${${(f)"$(_call_program commands docker 2>&1 | sed -e '1,6d' -e '/^[ ]*$/d' -e 's/[ ]*\([^ ]\+\)\s*\([^ ].*\)/\1:\2/' )"}}) _docker_subcommands=($_docker_subcommands 'help:Show help for a command') _store_cache docker_subcommands _docker_subcommands fi _describe -t docker-commands "docker command" _docker_subcommands } __docker_subcommand () { local -a _command_args case "$words[1]" in (attach|wait) _arguments ':containers:__docker_runningcontainers' ;; (build) _arguments \ '-t=-:repository:__docker_repositories' \ ':path or URL:_directories' ;; (commit) _arguments \ ':container:__docker_containers' \ ':repository:__docker_repositories' \ ':tag: ' ;; (diff|export|logs) _arguments '*:containers:__docker_containers' ;; (history) _arguments '*:images:__docker_images' ;; (images) _arguments \ '-a[Show all images]' \ ':repository:__docker_repositories' ;; (inspect) _arguments '*:containers:__docker_containers' ;; (history) _arguments ':images:__docker_images' ;; (insert) _arguments '1:containers:__docker_containers' \ '2:URL:(http:// file://)' \ '3:file:_files' ;; (kill) _arguments '*:containers:__docker_runningcontainers' ;; (port) _arguments '1:containers:__docker_runningcontainers' ;; (start) _arguments '*:containers:__docker_stoppedcontainers' ;; (rm) _arguments '-v[Remove the volumes associated to the container]' \ '*:containers:__docker_stoppedcontainers' ;; (rmi) _arguments '-v[Remove the volumes associated to the container]' \ '*:images:__docker_images' ;; (top) _arguments '1:containers:__docker_runningcontainers' ;; (restart|stop) _arguments '-t=-[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)' \ '*:containers:__docker_runningcontainers' ;; (top) _arguments ':containers:__docker_runningcontainers' ;; (ps) _arguments '-a[Show all containers. Only running containers are shown by default]' \ '-h[Show help]' \ '--before-id=-[Show only container created before Id, include non-running one]:containers:__docker_containers' \ '-n=-[Show n last created containers, include non-running one]:n:(1 5 10 25 50)' ;; (tag) _arguments \ '-f[force]'\ ':image:__docker_images'\ ':repository:__docker_repositories' \ ':tag:__docker_tags' ;; (run) _arguments \ '-a=-[Attach to stdin, stdout or stderr]:toggle:(true false)' \ '-c=-[CPU shares (relative weight)]:CPU shares: ' \ '-d[Detached mode: leave the container running in the background]' \ '*--dns=[Set custom dns servers]:dns server: ' \ '*-e=[Set environment variables]:environment variable: ' \ '--entrypoint=-[Overwrite the default entrypoint of the image]:entry point: ' \ '-h=-[Container host name]:hostname:_hosts' \ '-i[Keep stdin open even if not attached]' \ '-m=-[Memory limit (in bytes)]:limit: ' \ '*-p=-[Expose a container''s port to the host]:port:_ports' \ '-t=-[Allocate a pseudo-tty]:toggle:(true false)' \ '-u=-[Username or UID]:user:_users' \ '*-v=-[Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)]:volume: '\ '--volumes-from=-[Mount volumes from the specified container]:volume: ' \ '(-):images:__docker_images' \ '(-):command: _command_names -e' \ '*::arguments: _normal' ;; (pull|search) _arguments ':name:__docker_search' ;; (help) _arguments ':subcommand:__docker_commands' ;; (*) _message 'Unknown sub command' esac } _docker () { local curcontext="$curcontext" state line typeset -A opt_args _arguments -C \ '-H=-[tcp://host:port to bind/connect to]:socket: ' \ '(-): :->command' \ '(-)*:: :->option-or-argument' if (( CURRENT == 1 )); then fi case $state in (command) __docker_commands ;; (option-or-argument) curcontext=${curcontext%:*:*}:docker-$words[1]: __docker_subcommand ;; esac } _docker "$@"