diff --git a/src/_docker b/src/_docker new file mode 100644 index 0000000000..28568a6e5d --- /dev/null +++ b/src/_docker @@ -0,0 +1,356 @@ +#compdef docker + +# Docker autocompletion for oh-my-zsh +# Requires: Docker installed +# Author: Azaan (@aeonazaan) +# Updates: Bob Maerten (@bobmaerten) for Docker v0.9+ + + +# ----- Helper functions +# Output a selectable list of all running docker containers +__docker_containers() { + declare -a cont_cmd + cont_cmd=($(docker ps | awk 'NR>1{print $1":[CON("$1")"$2"("$3")]"}')) + _describe 'containers' cont_cmd +} + +# output a selectable list of all docker images +__docker_images() { + declare -a img_cmd + img_cmd=($(docker images | awk 'NR>1{print $1}')) + _describe 'images' img_cmd +} + +# ----- Commands +# Seperate function for each command, makes extension easier later +# --------------------------- +__attach() { + _arguments \ + '--no-stdin[Do not attach stdin]' \ + '--sig-proxy[Proxify all received signal to the process (even in non-tty mode)]' + __docker_containers +} + +__build() { + _arguments \ + '--no-cache[Do not use cache when building the image]' \ + '(-q,--quiet)'{-q,--quiet}'[Suppress the verbose output generated by the containers]' \ + '--rm[Remove intermediate containers after a successful build]' \ + '(-t,--tag=)'{-t,--tag=}'[Repository name (and optionally a tag) to be applied to the resulting image in case of success]' \ + '*:files:_files' +} + +__commit() { + _arguments \ + '(-a,--author=)'{-a,--author=}'[Author (eg. "John Hannibal Smith "]' \ + '(-m,--message=)'{-m,--message=}'[Commit message]' \ + '--run=[Config automatically applied when the image is run.]' + __docker_containers +} + +__cp() { + __docker_containers +} + +__diff() { + __docker_containers +} + +__events() { + _arguments \ + '--since=[Show previously created events and then stream.]' +} + +__export() { + __docker_containers +} + +__history() { + _arguments \ + '--no-trunc=[Don''t truncate output]' \ + '(-q,--quiet)'{-q,--quiet}'[Only show numeric IDs]' + __docker_images +} + +__images() { + _arguments \ + '(-a,--all)'{-a,--all}'[Show all images (by default filter out the intermediate images used to build)]' \ + '--no-trunc[Don''t truncate output]' \ + '(-q,--quiet=)'{-q,--quiet=}'[Only show numeric IDs]' \ + '(-t,--tree=)'{-t,--tree=}'[Output graph in tree format]' \ + '(-v,--viz=)'{-v,--viz=}'[Output graph in graphviz format]' + __docker_images +} + +__import() { + _arguments '*:files:_files' +} + +__info() { + # no arguments +} + +__insert() { + __docker_images + _arguments '*:files:_files' +} + +__inspect() { + __docker_images + __docker_containers +} + +__kill() { + __docker_containers +} + +__load() { + _arguments '*:files:_files' +} + +__login() { + _arguments \ + '(-e,--email=)'{-e,-email=}'[Email]' \ + '(-p,--password=)'{-p,-password=}'[Password]' \ + '(-u,--username=)'{-u,-username=}'[Username]' +} + +__logs() { + _arguments \ + '(-f,--follow)'{-f,-follow}'[Follow log output]' + __docker_containers +} + +__port() { + __docker_containers +} + +__top() { + __docker_containers +} + +__ps() { + _arguments \ + '(-a,--all)'{-a,--all}'[Show all containers. Only running containers are shown by default.]' \ + '--before-id=[Show only container created before Id, include non-running ones.]' \ + '(-l,--latest)'{-l,--latest}'[Show only the latest created container, include non-running ones.]' \ + '-n=[Show n last created containers, include non-running ones. default=-1.]' \ + '--no-trunc[Don''t truncate output]' \ + '(-q,--quiet)'{-q,--quiet}'[Only display numeric IDs]' \ + '(-s,--size)'{-s,--size}'[Display sizes]' \ + '--since-id=[Show only containers created since Id, include non-running ones.]' +} + +__pull() { + _arguments \ + '(-t,--tag=)'{-t,--tag=}'[Download tagged image in repository]' +} + +__push() { + # no arguments +} + +__restart() { + _arguments \ + '(-t,--time=)'{-t,--time=}'[Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default=10]' + __docker_containers +} + +__rm() { + _arguments \ + '(-f,--force=)'{-f,--force=}'[Force removal of running container]' \ + '(-l,--link=)'{-l,--link=}'[Remove the specified link and not the underlying container]' \ + '(-v,--volumes=)'{-v,--volumes=}'[Remove the volumes associated to the container]' + __docker_containers +} + +__rmi() { + _arguments \ + '(-f,--force=)'{-f,--force=}'[Force]' + __docker_images +} + +__run() { + _arguments \ + '(-P,--publish-all=)'{-P,--publish-all=}'[Publish all exposed ports to the host interfaces]' \ + '(-a,--attach=)'{-a,--attach=}'[Attach to stdin, stdout or stderr.]' \ + '(-c,--cpu-shares=)'{-c,--cpu-shares=}': CPU shares (relative weight)]' \ + '--cidfile=[Write the container ID to the file]' \ + '(-d,--detach=)'{-d,--detach=}'[Detached mode: Run container in the background, print new container id]' \ + '--dns=[Set custom dns servers]' \ + '(-e,--env=)'{-e,--env=}'[Set environment variables]' \ + '--entrypoint=[Overwrite the default entrypoint of the image]' \ + '--expose=[Expose a port from the container without publishing it to your host]' \ + '(-h,--hostname=)'{-h,--hostname=}'[Container host name]' \ + '(-i,--interactive=)'{-i,--interactive=}'[Keep stdin open even if not attached]' \ + '--link=[Add link to another container (name:alias)]' \ + '--lxc-conf=[Add custom lxc options -lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"]' \ + '(-m,--memory=)'{-m,--memory=}'[Memory limit (format: , where unit = b, k, m or g)]' \ + '(-n,--networking=)'{-n,--networking=}'[Enable networking for this container]' \ + '--name=[Assign a name to the container]' \ + '(-p,--publish=)'{-p,--publish=}'[Publish a container''s port to the host (format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort) (use "docker port" to see the actual mapping)]' \ + '--privileged=[Give extended privileges to this container]' \ + '--rm=[Automatically remove the container when it exits (incompatible with -d)]' \ + '--sig-proxy=[Proxify all received signal to the process (even in non-tty mode)]' \ + '(-t,--tty=)'{-t,--tty=}'[Allocate a pseudo-tty]' \ + '(-u,--user=)'{-u,--user=}'[Username or UID]' \ + '(-v,--volume=)'{-v,--volume=}'[Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)]' \ + '--volumes-from=[Mount volumes from the specified container(s)]' \ + '(-w,--workdir=)'{-w,--workdir=}'[Working directory inside the container]' + __docker_images +} + +__search() { + _arguments \ + '--no-trunc=[Don''t truncate output]' \ + '-s,--stars=)'{-s,--stars=}'[Only displays with at least xxx stars]' \ + '-t,--trusted=)'{-t,--trusted=}'[Only show trusted builds]' +} + +__save() { + __docker_images +} + +__start() { + _arguments \ + '(-a,--attach=)'{-a,--attach=}'[Attach container''s stdout/stderr and forward all signals to the process]' \ + '(-i,--interactive=)'{-i,--interactive=}'[Attach container''s stdin]' + __docker_containers +} + +__stop() { + _arguments \ + '(-t,--time=)'{-t,--time=}'[Number of seconds to wait for the container to stop before killing it.]' + __docker_containers +} + +__tag() { + _arguments \ + '(-f,--force=)'{-f,--force=}'[Force]' + __docker_images +} + +__version() { + # no arguments +} + +__wait() { + __docker_containers +} + +# end commands --------- +# ---------------------- + +local -a _1st_arguments +_1st_arguments=( + "attach":"Attach to a running container" + "build":"Build a container from a Dockerfile" + "commit":"Create a new image from a container's changes" + "cp":"Copy files/folders from the containers filesystem to the host path" + "diff":"Inspect changes on a container's filesystem" + "events":"Get real time events from the server" + "export":"Stream the contents of a container as a tar archive" + "history":"Show the history of an image" + "images":"List images" + "import":"Create a new filesystem image from the contents of a tarball" + "info":"Display system-wide information" + "insert":"Insert a file in an image" + "inspect":"Return low-level information on a container" + "kill":"Kill a running container" + "load":"Load an image from a tar archive" + "login":"Register or Login to the docker registry server" + "logs":"Fetch the logs of a container" + "port":"Lookup the public-facing port which is NAT-ed to PRIVATE_PORT" + "ps":"List containers" + "pull":"Pull an image or a repository from the docker registry server" + "push":"Push an image or a repository to the docker registry server" + "restart":"Restart a running container" + "rm":"Remove one or more containers" + "rmi":"Remove one or more images" + "run":"Run a command in a new container" + "save":"Save an image to a tar archive" + "search":"Search for an image in the docker index" + "start":"Start a stopped container" + "stop":"Stop a running container" + "tag":"Tag an image into a repository" + "top":"Lookup the running processes of a container" + "version":"Show the docker version information" + "wait":"Block until a container stops, then print its exit code" +) + +_arguments '*:: :->command' + +if (( CURRENT == 1 )); then + _describe -t commands "docker command" _1st_arguments + return +fi + +local -a _command_args +case "$words[1]" in + attach) + __attach ;; + build) + __build ;; + commit) + __commit ;; + cp) + __cp ;; + diff) + __diff ;; + events) + __events ;; + export) + __export ;; + history) + __history ;; + images) + __images ;; + import) + __import ;; + info) + __info ;; + insert) + __insert ;; + inspect) + __inspect ;; + kill) + __kill ;; + load) + __load ;; + login) + __login ;; + logs) + __logs ;; + port) + __port ;; + ps) + __ps ;; + pull) + __pull ;; + push) + __push ;; + restart) + __restart ;; + rm) + __rm ;; + rmi) + __rmi ;; + run) + __run ;; + save) + __save ;; + search) + __search ;; + start) + __start ;; + stop) + __stop ;; + tag) + __tag ;; + top) + __top ;; + version) + __version ;; + wait) + __wait ;; +esac