2013-08-07 08:49:21 -07:00
#compdef docker
# Docker autocompletion for oh-my-zsh
# Requires: Docker installed
2014-03-26 02:40:46 -07:00
# Author: Azaan (@aeonazaan)
# Updates: Bob Maerten (@bobmaerten) for Docker v0.9+
2014-12-18 14:59:00 -07:00
# Paul van den Berg (@bergvandenp) for Docker v1.3+
2013-08-07 08:49:21 -07:00
# ----- Helper functions
# Output a selectable list of all running docker containers
__docker_containers() {
declare -a cont_cmd
2015-02-13 05:49:54 -07:00
cont_cmd=($(docker ps | awk 'NR>1{print $NF":[CON("$1")"$2"("$3")]"}'))
2013-08-07 08:49:21 -07:00
_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() {
2014-03-26 02:40:46 -07:00
_arguments \
'--no-stdin[Do not attach stdin]' \
'--sig-proxy[Proxify all received signal to the process (even in non-tty mode)]'
2013-08-07 08:49:21 -07:00
__docker_containers
}
__build() {
_arguments \
2014-03-26 02:40:46 -07:00
'--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]' \
2013-08-07 09:41:49 -07:00
'*:files:_files'
2013-08-07 08:49:21 -07:00
}
__commit() {
_arguments \
2014-03-26 02:40:46 -07:00
'(-a,--author=)'{-a,--author=}'[Author (eg. "John Hannibal Smith <hannibal@a-team.com>"]' \
'(-m,--message=)'{-m,--message=}'[Commit message]' \
'--run=[Config automatically applied when the image is run.]'
__docker_containers
}
__cp() {
2013-08-07 08:49:21 -07:00
__docker_containers
}
__diff() {
__docker_containers
}
2014-03-26 02:40:46 -07:00
__events() {
_arguments \
'--since=[Show previously created events and then stream.]'
}
2013-08-07 08:49:21 -07:00
__export() {
__docker_containers
}
__history() {
2014-03-26 02:40:46 -07:00
_arguments \
'--no-trunc=[Don''t truncate output]' \
'(-q,--quiet)'{-q,--quiet}'[Only show numeric IDs]'
2013-08-07 08:49:21 -07:00
__docker_images
}
__images() {
_arguments \
2014-03-26 02:40:46 -07:00
'(-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]'
2013-08-07 08:49:21 -07:00
__docker_images
}
__import() {
_arguments '*:files:_files'
}
__info() {
# no arguments
}
__insert() {
__docker_images
_arguments '*:files:_files'
}
__inspect() {
__docker_images
__docker_containers
}
__kill() {
__docker_containers
}
2014-03-26 02:40:46 -07:00
__load() {
_arguments '*:files:_files'
}
2013-08-07 08:49:21 -07:00
__login() {
_arguments \
2014-03-26 02:40:46 -07:00
'(-e,--email=)'{-e,-email=}'[Email]' \
'(-p,--password=)'{-p,-password=}'[Password]' \
'(-u,--username=)'{-u,-username=}'[Username]'
2013-08-07 08:49:21 -07:00
}
__logs() {
2014-03-26 02:40:46 -07:00
_arguments \
'(-f,--follow)'{-f,-follow}'[Follow log output]'
2013-08-07 08:49:21 -07:00
__docker_containers
}
__port() {
__docker_containers
}
__top() {
__docker_containers
}
__ps() {
_arguments \
2014-03-26 02:40:46 -07:00
'(-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.]'
2013-08-07 08:49:21 -07:00
}
__pull() {
2014-03-26 02:40:46 -07:00
_arguments \
'(-t,--tag=)'{-t,--tag=}'[Download tagged image in repository]'
2013-08-07 08:49:21 -07:00
}
__push() {
2014-03-26 02:40:46 -07:00
# no arguments
2013-08-07 08:49:21 -07:00
}
__restart() {
2014-03-26 02:40:46 -07:00
_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]'
2013-08-07 08:49:21 -07:00
__docker_containers
}
__rm() {
2014-03-26 02:40:46 -07:00
_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]'
2013-08-07 08:49:21 -07:00
__docker_containers
}
__rmi() {
2014-03-26 02:40:46 -07:00
_arguments \
2014-04-06 04:51:18 -07:00
'(-f,--force=)'{-f,--force=}'[Force]'
2013-08-07 08:49:21 -07:00
__docker_images
}
__run() {
_arguments \
2014-03-26 02:40:46 -07:00
'(-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: <number><optional unit>, 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]'
2013-08-07 08:49:21 -07:00
__docker_images
}
__search() {
2014-03-26 02:40:46 -07:00
_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
2013-08-07 08:49:21 -07:00
}
__start() {
2014-03-26 02:40:46 -07:00
_arguments \
'(-a,--attach=)'{-a,--attach=}'[Attach container''s stdout/stderr and forward all signals to the process]' \
2014-07-14 16:41:57 -07:00
'(-i,--interactive=)'{-i,--interactive=}'[Attach container''s stdin]'
2013-08-07 09:41:49 -07:00
__docker_containers
2013-08-07 08:49:21 -07:00
}
2015-02-16 04:04:37 -07:00
__stats() {
__docker_containers
}
2013-08-07 08:49:21 -07:00
__stop() {
2014-03-26 02:40:46 -07:00
_arguments \
'(-t,--time=)'{-t,--time=}'[Number of seconds to wait for the container to stop before killing it.]'
2013-08-07 08:49:21 -07:00
__docker_containers
}
__tag() {
2014-03-26 02:40:46 -07:00
_arguments \
'(-f,--force=)'{-f,--force=}'[Force]'
2013-08-07 08:49:21 -07:00
__docker_images
}
__version() {
2014-03-26 02:40:46 -07:00
# no arguments
2013-08-07 08:49:21 -07:00
}
__wait() {
2013-08-07 09:41:49 -07:00
__docker_containers
2013-08-07 08:49:21 -07:00
}
2014-12-18 14:59:00 -07:00
__exec() {
_arguments \
'(-d,--detach=)'{-d,--detach=}'[Detached mode: run command in the background]' \
'(-i,--interactive=)'{-i,--interactive=}'[Keep STDIN open even if not attached]' \
'(-t,--tty=)'{-t,--tty=}'[Allocate a pseudo-TTY]'
__docker_containers
}
2013-08-07 08:49:21 -07:00
# 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"
2014-03-26 02:40:46 -07:00
"cp":"Copy files/folders from the containers filesystem to the host path"
2013-08-07 08:49:21 -07:00
"diff":"Inspect changes on a container's filesystem"
2014-03-26 02:40:46 -07:00
"events":"Get real time events from the server"
2013-08-07 08:49:21 -07:00
"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"
2014-03-26 02:40:46 -07:00
"load":"Load an image from a tar archive"
2013-08-07 08:49:21 -07:00
"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"
2014-03-26 02:40:46 -07:00
"save":"Save an image to a tar archive"
2013-08-07 08:49:21 -07:00
"search":"Search for an image in the docker index"
"start":"Start a stopped container"
2015-02-16 04:04:37 -07:00
"stats":"Display a live stream of one or more containers' resource usage statistics"
2013-08-07 08:49:21 -07:00
"stop":"Stop a running container"
"tag":"Tag an image into a repository"
2014-03-26 02:40:46 -07:00
"top":"Lookup the running processes of a container"
2013-08-07 08:49:21 -07:00
"version":"Show the docker version information"
"wait":"Block until a container stops, then print its exit code"
2014-12-18 14:59:00 -07:00
"exec":"Run a task inside a running container"
2013-08-07 08:49:21 -07:00
)
_arguments '*:: :->command'
if (( CURRENT == 1 )); then
_describe -t commands "docker command" _1st_arguments
return
fi
local -a _command_args
case "$words[1]" in
attach)
2014-03-26 02:40:46 -07:00
__attach ;;
2013-08-07 08:49:21 -07:00
build)
__build ;;
commit)
__commit ;;
2014-03-26 02:40:46 -07:00
cp)
__cp ;;
2013-08-07 08:49:21 -07:00
diff)
__diff ;;
2014-03-26 02:40:46 -07:00
events)
__events ;;
2013-08-07 08:49:21 -07:00
export)
__export ;;
history)
__history ;;
images)
__images ;;
import)
__import ;;
info)
__info ;;
insert)
__insert ;;
inspect)
__inspect ;;
kill)
__kill ;;
2014-03-26 02:40:46 -07:00
load)
__load ;;
2013-08-07 08:49:21 -07:00
login)
__login ;;
logs)
__logs ;;
port)
__port ;;
ps)
__ps ;;
pull)
__pull ;;
push)
__push ;;
restart)
__restart ;;
rm)
__rm ;;
rmi)
__rmi ;;
run)
__run ;;
2014-03-26 02:40:46 -07:00
save)
__save ;;
2013-08-07 08:49:21 -07:00
search)
__search ;;
2015-02-16 04:04:37 -07:00
stats)
__stats ;;
2013-08-07 08:49:21 -07:00
start)
__start ;;
stop)
__stop ;;
tag)
__tag ;;
2014-03-26 02:40:46 -07:00
top)
__top ;;
2013-08-07 08:49:21 -07:00
version)
__version ;;
wait)
__wait ;;
2014-12-18 14:59:00 -07:00
exec)
__exec ;;
2013-08-07 08:49:21 -07:00
esac