github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/contrib/completion/zsh/_docker (about) 1 #compdef docker dockerd 2 # 3 # zsh completion for docker (http://docker.com) 4 # 5 # version: 0.3.0 6 # github: https://github.com/felixr/docker-zsh-completion 7 # 8 # contributors: 9 # - Felix Riedel 10 # - Steve Durrheimer 11 # - Vincent Bernat 12 # 13 # license: 14 # 15 # Copyright (c) 2013, Felix Riedel 16 # All rights reserved. 17 # 18 # Redistribution and use in source and binary forms, with or without 19 # modification, are permitted provided that the following conditions are met: 20 # * Redistributions of source code must retain the above copyright 21 # notice, this list of conditions and the following disclaimer. 22 # * Redistributions in binary form must reproduce the above copyright 23 # notice, this list of conditions and the following disclaimer in the 24 # documentation and/or other materials provided with the distribution. 25 # * Neither the name of the <organization> nor the 26 # names of its contributors may be used to endorse or promote products 27 # derived from this software without specific prior written permission. 28 # 29 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 30 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 31 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 32 # DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 33 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 35 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 36 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 37 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 38 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 # 40 41 # Short-option stacking can be enabled with: 42 # zstyle ':completion:*:*:docker:*' option-stacking yes 43 # zstyle ':completion:*:*:docker-*:*' option-stacking yes 44 __docker_arguments() { 45 if zstyle -t ":completion:${curcontext}:" option-stacking; then 46 print -- -s 47 fi 48 } 49 50 __docker_get_containers() { 51 [[ $PREFIX = -* ]] && return 1 52 integer ret=1 53 local kind type line s 54 declare -a running stopped lines args names 55 56 kind=$1; shift 57 type=$1; shift 58 [[ $kind = (stopped|all) ]] && args=($args -a) 59 60 lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}}) 61 62 # Parse header line to find columns 63 local i=1 j=1 k header=${lines[1]} 64 declare -A begin end 65 while (( j < ${#header} - 1 )); do 66 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 67 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 68 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 69 begin[${header[$i,$((j-1))]}]=$i 70 end[${header[$i,$((j-1))]}]=$k 71 done 72 end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line 73 lines=(${lines[2,-1]}) 74 75 # Container ID 76 if [[ $type = (ids|all) ]]; then 77 for line in $lines; do 78 s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}" 79 s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" 80 s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" 81 if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then 82 stopped=($stopped $s) 83 else 84 running=($running $s) 85 fi 86 done 87 fi 88 89 # Names: we only display the one without slash. All other names 90 # are generated and may clutter the completion. However, with 91 # Swarm, all names may be prefixed by the swarm node name. 92 if [[ $type = (names|all) ]]; then 93 for line in $lines; do 94 names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}}) 95 # First step: find a common prefix and strip it (swarm node case) 96 (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/} 97 # Second step: only keep the first name without a / 98 s=${${names:#*/*}[1]} 99 # If no name, well give up. 100 (( $#s != 0 )) || continue 101 s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" 102 s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" 103 if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then 104 stopped=($stopped $s) 105 else 106 running=($running $s) 107 fi 108 done 109 fi 110 111 [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0 112 [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0 113 return ret 114 } 115 116 __docker_complete_stopped_containers() { 117 [[ $PREFIX = -* ]] && return 1 118 __docker_get_containers stopped all "$@" 119 } 120 121 __docker_complete_running_containers() { 122 [[ $PREFIX = -* ]] && return 1 123 __docker_get_containers running all "$@" 124 } 125 126 __docker_complete_containers() { 127 [[ $PREFIX = -* ]] && return 1 128 __docker_get_containers all all "$@" 129 } 130 131 __docker_complete_containers_ids() { 132 [[ $PREFIX = -* ]] && return 1 133 __docker_get_containers all ids "$@" 134 } 135 136 __docker_complete_containers_names() { 137 [[ $PREFIX = -* ]] && return 1 138 __docker_get_containers all names "$@" 139 } 140 141 __docker_complete_info_plugins() { 142 [[ $PREFIX = -* ]] && return 1 143 integer ret=1 144 emulate -L zsh 145 setopt extendedglob 146 local -a plugins 147 plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: }) 148 _describe -t plugins "$1 plugins" plugins && ret=0 149 return ret 150 } 151 152 __docker_complete_images() { 153 [[ $PREFIX = -* ]] && return 1 154 integer ret=1 155 declare -a images 156 images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) 157 _describe -t docker-images "images" images && ret=0 158 __docker_complete_repositories_with_tags && ret=0 159 return ret 160 } 161 162 __docker_complete_repositories() { 163 [[ $PREFIX = -* ]] && return 1 164 integer ret=1 165 declare -a repos 166 repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]}) 167 repos=(${repos#<none>}) 168 _describe -t docker-repos "repositories" repos && ret=0 169 return ret 170 } 171 172 __docker_complete_repositories_with_tags() { 173 [[ $PREFIX = -* ]] && return 1 174 integer ret=1 175 declare -a repos onlyrepos matched 176 declare m 177 repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *}) 178 repos=(${${repos%:::<none>}#<none>}) 179 # Check if we have a prefix-match for the current prefix. 180 onlyrepos=(${repos%::*}) 181 for m in $onlyrepos; do 182 [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && { 183 # Yes, complete with tags 184 repos=(${${repos/:::/:}/:/\\:}) 185 _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0 186 return ret 187 } 188 done 189 # No, only complete repositories 190 onlyrepos=(${${repos%:::*}/:/\\:}) 191 _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0 192 193 return ret 194 } 195 196 __docker_search() { 197 [[ $PREFIX = -* ]] && return 1 198 local cache_policy 199 zstyle -s ":completion:${curcontext}:" cache-policy cache_policy 200 if [[ -z "$cache_policy" ]]; then 201 zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy 202 fi 203 204 local searchterm cachename 205 searchterm="${words[$CURRENT]%/}" 206 cachename=_docker-search-$searchterm 207 208 local expl 209 local -a result 210 if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ 211 && ! _retrieve_cache ${cachename#_}; then 212 _message "Searching for ${searchterm}..." 213 result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]}) 214 _store_cache ${cachename#_} result 215 fi 216 _wanted dockersearch expl 'available images' compadd -a result 217 } 218 219 __docker_get_log_options() { 220 [[ $PREFIX = -* ]] && return 1 221 222 integer ret=1 223 local log_driver=${opt_args[--log-driver]:-"all"} 224 local -a awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options 225 226 awslogs_options=("awslogs-region" "awslogs-group" "awslogs-stream") 227 fluentd_options=("env" "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "labels" "tag") 228 gcplogs_options=("env" "gcp-log-cmd" "gcp-project" "labels") 229 gelf_options=("env" "gelf-address" "gelf-compression-level" "gelf-compression-type" "labels" "tag") 230 journald_options=("env" "labels" "tag") 231 json_file_options=("env" "labels" "max-file" "max-size") 232 logentries_options=("logentries-token") 233 syslog_options=("env" "labels" "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag") 234 splunk_options=("env" "labels" "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag") 235 236 [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0 237 [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0 238 [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0 239 [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0 240 [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0 241 [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0 242 [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0 243 [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0 244 [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0 245 246 return ret 247 } 248 249 __docker_complete_log_drivers() { 250 [[ $PREFIX = -* ]] && return 1 251 integer ret=1 252 drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog) 253 _describe -t log-drivers "log drivers" drivers && ret=0 254 return ret 255 } 256 257 __docker_complete_log_options() { 258 [[ $PREFIX = -* ]] && return 1 259 integer ret=1 260 261 if compset -P '*='; then 262 case "${${words[-1]%=*}#*=}" in 263 (syslog-format) 264 syslog_format_opts=('rfc3164' 'rfc5424' 'rfc5424micro') 265 _describe -t syslog-format-opts "Syslog format Options" syslog_format_opts && ret=0 266 ;; 267 *) 268 _message 'value' && ret=0 269 ;; 270 esac 271 else 272 __docker_get_log_options -qS "=" && ret=0 273 fi 274 275 return ret 276 } 277 278 __docker_complete_detach_keys() { 279 [[ $PREFIX = -* ]] && return 1 280 integer ret=1 281 282 compset -P "*," 283 keys=(${:-{a-z}}) 284 ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}}) 285 _describe -t detach_keys "[a-z]" keys -qS "," && ret=0 286 _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0 287 } 288 289 __docker_complete_pid() { 290 [[ $PREFIX = -* ]] && return 1 291 integer ret=1 292 local -a opts vopts 293 294 opts=('host') 295 vopts=('container') 296 297 if compset -P '*:'; then 298 case "${${words[-1]%:*}#*=}" in 299 (container) 300 __docker_complete_running_containers && ret=0 301 ;; 302 *) 303 _message 'value' && ret=0 304 ;; 305 esac 306 else 307 _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0 308 _describe -t pid-opts "PID Options" opts && ret=0 309 fi 310 311 return ret 312 } 313 314 __docker_complete_runtimes() { 315 [[ $PREFIX = -* ]] && return 1 316 integer ret=1 317 318 emulate -L zsh 319 setopt extendedglob 320 local -a runtimes_opts 321 runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}}) 322 _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0 323 } 324 325 __docker_complete_ps_filters() { 326 [[ $PREFIX = -* ]] && return 1 327 integer ret=1 328 329 if compset -P '*='; then 330 case "${${words[-1]%=*}#*=}" in 331 (ancestor) 332 __docker_complete_images && ret=0 333 ;; 334 (before|since) 335 __docker_complete_containers && ret=0 336 ;; 337 (health) 338 health_opts=('healthy' 'none' 'starting' 'unhealthy') 339 _describe -t health-filter-opts "health filter options" health_opts && ret=0 340 ;; 341 (id) 342 __docker_complete_containers_ids && ret=0 343 ;; 344 (is-task) 345 _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 346 ;; 347 (name) 348 __docker_complete_containers_names && ret=0 349 ;; 350 (network) 351 __docker_complete_networks && ret=0 352 ;; 353 (status) 354 status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing') 355 _describe -t status-filter-opts "status filter options" status_opts && ret=0 356 ;; 357 (volume) 358 __docker_complete_volumes && ret=0 359 ;; 360 *) 361 _message 'value' && ret=0 362 ;; 363 esac 364 else 365 opts=('ancestor' 'before' 'exited' 'health' 'id' 'label' 'name' 'network' 'since' 'status' 'volume') 366 _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 367 fi 368 369 return ret 370 } 371 372 __docker_complete_search_filters() { 373 [[ $PREFIX = -* ]] && return 1 374 integer ret=1 375 declare -a boolean_opts opts 376 377 boolean_opts=('true' 'false') 378 opts=('is-automated' 'is-official' 'stars') 379 380 if compset -P '*='; then 381 case "${${words[-1]%=*}#*=}" in 382 (is-automated|is-official) 383 _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 384 ;; 385 *) 386 _message 'value' && ret=0 387 ;; 388 esac 389 else 390 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 391 fi 392 393 return ret 394 } 395 396 __docker_complete_images_filters() { 397 [[ $PREFIX = -* ]] && return 1 398 integer ret=1 399 declare -a boolean_opts opts 400 401 boolean_opts=('true' 'false') 402 opts=('before' 'dangling' 'label' 'reference' 'since') 403 404 if compset -P '*='; then 405 case "${${words[-1]%=*}#*=}" in 406 (before|reference|since) 407 __docker_complete_images && ret=0 408 ;; 409 (dangling) 410 _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 411 ;; 412 *) 413 _message 'value' && ret=0 414 ;; 415 esac 416 else 417 _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 418 fi 419 420 return ret 421 } 422 423 __docker_complete_events_filter() { 424 [[ $PREFIX = -* ]] && return 1 425 integer ret=1 426 declare -a opts 427 428 opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'type' 'volume') 429 430 if compset -P '*='; then 431 case "${${words[-1]%=*}#*=}" in 432 (container) 433 __docker_complete_containers && ret=0 434 ;; 435 (daemon) 436 emulate -L zsh 437 setopt extendedglob 438 local -a daemon_opts 439 daemon_opts=( 440 ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}} 441 ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:} 442 ) 443 _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0 444 ;; 445 (event) 446 local -a event_opts 447 event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disconnect' 'exec_create' 'exec_detach' 448 'exec_start' 'export' 'health_status' 'import' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'rename' 'resize' 'restart' 'save' 'start' 449 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update') 450 _describe -t event-filter-opts "event filter options" event_opts && ret=0 451 ;; 452 (image) 453 __docker_complete_images && ret=0 454 ;; 455 (network) 456 __docker_complete_networks && ret=0 457 ;; 458 (type) 459 local -a type_opts 460 type_opts=('container' 'daemon' 'image' 'network' 'volume') 461 _describe -t type-filter-opts "type filter options" type_opts && ret=0 462 ;; 463 (volume) 464 __docker_complete_volumes && ret=0 465 ;; 466 *) 467 _message 'value' && ret=0 468 ;; 469 esac 470 else 471 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 472 fi 473 474 return ret 475 } 476 477 # BO container 478 479 __docker_container_commands() { 480 local -a _docker_container_subcommands 481 _docker_container_subcommands=( 482 "attach:Attach to a running container" 483 "commit:Create a new image from a container's changes" 484 "cp:Copy files/folders between a container and the local filesystem" 485 "create:Create a new container" 486 "diff:Inspect changes on a container's filesystem" 487 "exec:Run a command in a running container" 488 "export:Export a container's filesystem as a tar archive" 489 "inspect:Display detailed information on one or more containers" 490 "kill:Kill one or more running containers" 491 "logs:Fetch the logs of a container" 492 "ls:List containers" 493 "pause:Pause all processes within one or more containers" 494 "port:List port mappings or a specific mapping for the container" 495 "prune:Remove all stopped containers" 496 "rename:Rename a container" 497 "restart:Restart one or more containers" 498 "rm:Remove one or more containers" 499 "run:Run a command in a new container" 500 "start:Start one or more stopped containers" 501 "stats:Display a live stream of container(s) resource usage statistics" 502 "stop:Stop one or more running containers" 503 "top:Display the running processes of a container" 504 "unpause:Unpause all processes within one or more containers" 505 "update:Update configuration of one or more containers" 506 "wait:Block until one or more containers stop, then print their exit codes" 507 ) 508 _describe -t docker-container-commands "docker container command" _docker_container_subcommands 509 } 510 511 __docker_container_subcommand() { 512 local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update 513 local expl help="--help" 514 integer ret=1 515 516 opts_attach_exec_run_start=( 517 "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys" 518 ) 519 opts_create_run=( 520 "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)" 521 "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " 522 "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: " 523 "($help)*--cap-add=[Add Linux capabilities]:capability: " 524 "($help)*--cap-drop=[Drop Linux capabilities]:capability: " 525 "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " 526 "($help)--cidfile=[Write the container ID to the file]:CID file:_files" 527 "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: " 528 "($help)*--device=[Add a host device to the container]:device:_files" 529 "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: " 530 "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: " 531 "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: " 532 "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: " 533 "($help)--disable-content-trust[Skip image verification]" 534 "($help)*--dns=[Custom DNS servers]:DNS server: " 535 "($help)*--dns-option=[Custom DNS options]:DNS option: " 536 "($help)*--dns-search=[Custom DNS search domains]:DNS domains: " 537 "($help)*"{-e=,--env=}"[Environment variables]:environment variable: " 538 "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: " 539 "($help)*--env-file=[Read environment variables from a file]:environment file:_files" 540 "($help)*--expose=[Expose a port from the container without publishing it]: " 541 "($help)*--group=[Set one or more supplementary user groups for the container]:group:_groups" 542 "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" 543 "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" 544 "($help)--ip=[IPv4 address]:IPv4: " 545 "($help)--ip6=[IPv6 address]:IPv6: " 546 "($help)--ipc=[IPC namespace to use]:IPC namespace: " 547 "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" 548 "($help)*--link=[Add link to another container]:link:->link" 549 "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: " 550 "($help)*"{-l=,--label=}"[Container metadata]:label: " 551 "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" 552 "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" 553 "($help)--mac-address=[Container MAC address]:MAC address: " 554 "($help)--name=[Container name]:name: " 555 "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" 556 "($help)*--network-alias=[Add network-scoped alias for the container]:alias: " 557 "($help)--oom-kill-disable[Disable OOM Killer]" 558 "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]" 559 "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" 560 "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]" 561 "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" 562 "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" 563 "($help)--privileged[Give extended privileges to this container]" 564 "($help)--read-only[Mount the container's root filesystem as read only]" 565 "($help)*--security-opt=[Security options]:security option: " 566 "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " 567 "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: " 568 "($help)*--sysctl=-[sysctl options]:sysctl: " 569 "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" 570 "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" 571 "($help)*--ulimit=[ulimit options]:ulimit: " 572 "($help)--userns=[Container user namespace]:user namespace:(host)" 573 "($help)--tmpfs[mount tmpfs]" 574 "($help)*-v[Bind mount a volume]:volume: " 575 "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)" 576 "($help)*--volumes-from=[Mount volumes from the specified container]:volume: " 577 "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" 578 ) 579 opts_create_run_update=( 580 "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)" 581 "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" 582 "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " 583 "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " 584 "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " 585 "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " 586 "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " 587 "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " 588 "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: " 589 "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " 590 "($help)--memory-reservation=[Memory soft limit]:Memory limit: " 591 "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " 592 "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)" 593 ) 594 opts_help=("(: -)--help[Print usage]") 595 596 case "$words[1]" in 597 (attach) 598 _arguments $(__docker_arguments) \ 599 $opts_help \ 600 $opts_attach_exec_run_start \ 601 "($help)--no-stdin[Do not attach stdin]" \ 602 "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ 603 "($help -):containers:__docker_complete_running_containers" && ret=0 604 ;; 605 (commit) 606 _arguments $(__docker_arguments) \ 607 $opts_help \ 608 "($help -a --author)"{-a=,--author=}"[Author]:author: " \ 609 "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ 610 "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \ 611 "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \ 612 "($help -):container:__docker_complete_containers" \ 613 "($help -): :__docker_complete_repositories_with_tags" && ret=0 614 ;; 615 (cp) 616 local state 617 _arguments $(__docker_arguments) \ 618 $opts_help \ 619 "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \ 620 "($help -)1:container:->container" \ 621 "($help -)2:hostpath:_files" && ret=0 622 case $state in 623 (container) 624 if compset -P "*:"; then 625 _files && ret=0 626 else 627 __docker_complete_containers -qS ":" && ret=0 628 fi 629 ;; 630 esac 631 ;; 632 (create) 633 local state 634 _arguments $(__docker_arguments) \ 635 $opts_help \ 636 $opts_create_run \ 637 $opts_create_run_update \ 638 "($help -): :__docker_complete_images" \ 639 "($help -):command: _command_names -e" \ 640 "($help -)*::arguments: _normal" && ret=0 641 case $state in 642 (link) 643 if compset -P "*:"; then 644 _wanted alias expl "Alias" compadd -E "" && ret=0 645 else 646 __docker_complete_running_containers -qS ":" && ret=0 647 fi 648 ;; 649 esac 650 ;; 651 (diff) 652 _arguments $(__docker_arguments) \ 653 $opts_help \ 654 "($help -)*:containers:__docker_complete_containers" && ret=0 655 ;; 656 (exec) 657 local state 658 _arguments $(__docker_arguments) \ 659 $opts_help \ 660 $opts_attach_exec_run_start \ 661 "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ 662 "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \ 663 "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \ 664 "($help)--privileged[Give extended Linux capabilities to the command]" \ 665 "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \ 666 "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \ 667 "($help -):containers:__docker_complete_running_containers" \ 668 "($help -)*::command:->anycommand" && ret=0 669 case $state in 670 (anycommand) 671 shift 1 words 672 (( CURRENT-- )) 673 _normal && ret=0 674 ;; 675 esac 676 ;; 677 (export) 678 _arguments $(__docker_arguments) \ 679 $opts_help \ 680 "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \ 681 "($help -)*:containers:__docker_complete_containers" && ret=0 682 ;; 683 (inspect) 684 _arguments $(__docker_arguments) \ 685 $opts_help \ 686 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 687 "($help -s --size)"{-s,--size}"[Display total file sizes]" \ 688 "($help -)*:containers:__docker_complete_containers" && ret=0 689 ;; 690 (kill) 691 _arguments $(__docker_arguments) \ 692 $opts_help \ 693 "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \ 694 "($help -)*:containers:__docker_complete_running_containers" && ret=0 695 ;; 696 (logs) 697 _arguments $(__docker_arguments) \ 698 $opts_help \ 699 "($help)--details[Show extra details provided to logs]" \ 700 "($help -f --follow)"{-f,--follow}"[Follow log output]" \ 701 "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \ 702 "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ 703 "($help)--tail=[Output the last K lines]:lines:(1 10 20 50 all)" \ 704 "($help -)*:containers:__docker_complete_containers" && ret=0 705 ;; 706 (ls|list) 707 _arguments $(__docker_arguments) \ 708 $opts_help \ 709 "($help -a --all)"{-a,--all}"[Show all containers]" \ 710 "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ 711 "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ 712 "($help)--format=[Pretty-print containers using a Go template]:template: " \ 713 "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ 714 "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ 715 "($help)--no-trunc[Do not truncate output]" \ 716 "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ 717 "($help -s --size)"{-s,--size}"[Display total file sizes]" \ 718 "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0 719 ;; 720 (pause|unpause) 721 _arguments $(__docker_arguments) \ 722 $opts_help \ 723 "($help -)*:containers:__docker_complete_running_containers" && ret=0 724 ;; 725 (port) 726 _arguments $(__docker_arguments) \ 727 $opts_help \ 728 "($help -)1:containers:__docker_complete_running_containers" \ 729 "($help -)2:port:_ports" && ret=0 730 ;; 731 (prune) 732 _arguments $(__docker_arguments) \ 733 $opts_help \ 734 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 735 ;; 736 (rename) 737 _arguments $(__docker_arguments) \ 738 $opts_help \ 739 "($help -):old name:__docker_complete_containers" \ 740 "($help -):new name: " && ret=0 741 ;; 742 (restart) 743 _arguments $(__docker_arguments) \ 744 $opts_help \ 745 "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ 746 "($help -)*:containers:__docker_complete_containers_ids" && ret=0 747 ;; 748 (rm) 749 local state 750 _arguments $(__docker_arguments) \ 751 $opts_help \ 752 "($help -f --force)"{-f,--force}"[Force removal]" \ 753 "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \ 754 "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \ 755 "($help -)*:containers:->values" && ret=0 756 case $state in 757 (values) 758 if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then 759 __docker_complete_containers && ret=0 760 else 761 __docker_complete_stopped_containers && ret=0 762 fi 763 ;; 764 esac 765 ;; 766 (run) 767 local state 768 _arguments $(__docker_arguments) \ 769 $opts_help \ 770 $opts_create_run \ 771 $opts_create_run_update \ 772 $opts_attach_exec_run_start \ 773 "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ 774 "($help)--health-cmd=[Command to run to check health]:command: " \ 775 "($help)--health-interval=[Time between running the check]:time: " \ 776 "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \ 777 "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \ 778 "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \ 779 "($help)--rm[Remove intermediate containers when it exits]" \ 780 "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \ 781 "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ 782 "($help)--stop-signal=[Signal to kill a container]:signal:_signals" \ 783 "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \ 784 "($help -): :__docker_complete_images" \ 785 "($help -):command: _command_names -e" \ 786 "($help -)*::arguments: _normal" && ret=0 787 case $state in 788 (link) 789 if compset -P "*:"; then 790 _wanted alias expl "Alias" compadd -E "" && ret=0 791 else 792 __docker_complete_running_containers -qS ":" && ret=0 793 fi 794 ;; 795 (storage-opt) 796 if compset -P "*="; then 797 _message "value" && ret=0 798 else 799 opts=('size') 800 _describe -t filter-opts "storage options" opts -qS "=" && ret=0 801 fi 802 ;; 803 esac 804 ;; 805 (start) 806 _arguments $(__docker_arguments) \ 807 $opts_help \ 808 $opts_attach_exec_run_start \ 809 "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \ 810 "($help -i --interactive)"{-i,--interactive}"[Attach container's stding]" \ 811 "($help -)*:containers:__docker_complete_stopped_containers" && ret=0 812 ;; 813 (stats) 814 _arguments $(__docker_arguments) \ 815 $opts_help \ 816 "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ 817 "($help)--format=[Pretty-print images using a Go template]:template: " \ 818 "($help)--no-stream[Disable streaming stats and only pull the first result]" \ 819 "($help -)*:containers:__docker_complete_running_containers" && ret=0 820 ;; 821 (stop) 822 _arguments $(__docker_arguments) \ 823 $opts_help \ 824 "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ 825 "($help -)*:containers:__docker_complete_running_containers" && ret=0 826 ;; 827 (top) 828 local state 829 _arguments $(__docker_arguments) \ 830 $opts_help \ 831 "($help -)1:containers:__docker_complete_running_containers" \ 832 "($help -)*:: :->ps-arguments" && ret=0 833 case $state in 834 (ps-arguments) 835 _ps && ret=0 836 ;; 837 esac 838 ;; 839 (update) 840 local state 841 _arguments $(__docker_arguments) \ 842 $opts_help \ 843 opts_create_run_update \ 844 "($help -)*: :->values" && ret=0 845 case $state in 846 (values) 847 if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then 848 __docker_complete_stopped_containers && ret=0 849 else 850 __docker_complete_containers && ret=0 851 fi 852 ;; 853 esac 854 ;; 855 (wait) 856 _arguments $(__docker_arguments) \ 857 $opts_help \ 858 "($help -)*:containers:__docker_complete_running_containers" && ret=0 859 ;; 860 (help) 861 _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 862 ;; 863 esac 864 865 return ret 866 } 867 868 # EO container 869 870 # BO image 871 872 __docker_image_commands() { 873 local -a _docker_image_subcommands 874 _docker_image_subcommands=( 875 "build:Build an image from a Dockerfile" 876 "history:Show the history of an image" 877 "import:Import the contents from a tarball to create a filesystem image" 878 "inspect:Display detailed information on one or more images" 879 "load:Load an image from a tar archive or STDIN" 880 "ls:List images" 881 "prune:Remove unused images" 882 "pull:Pull an image or a repository from a registry" 883 "push:Push an image or a repository to a registry" 884 "rm:Remove one or more images" 885 "save:Save one or more images to a tar archive (streamed to STDOUT by default)" 886 "tag:Tag an image into a repository" 887 ) 888 _describe -t docker-image-commands "docker image command" _docker_image_subcommands 889 } 890 891 __docker_image_subcommand() { 892 local -a _command_args opts_help 893 local expl help="--help" 894 integer ret=1 895 896 opts_help=("(: -)--help[Print usage]") 897 898 case "$words[1]" in 899 (build) 900 _arguments $(__docker_arguments) \ 901 $opts_help \ 902 "($help)*--build-arg=[Build-time variables]:<varname>=<value>: " \ 903 "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \ 904 "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \ 905 "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \ 906 "($help)--compress[Compress the build context using gzip]" \ 907 "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \ 908 "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \ 909 "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \ 910 "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \ 911 "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \ 912 "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \ 913 "($help)--disable-content-trust[Skip image verification]" \ 914 "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \ 915 "($help)--force-rm[Always remove intermediate containers]" \ 916 "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \ 917 "($help)*--label=[Set metadata for an image]:label=value: " \ 918 "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ 919 "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ 920 "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ 921 "($help)--no-cache[Do not use cache when building the image]" \ 922 "($help)--pull[Attempt to pull a newer version of the image]" \ 923 "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ 924 "($help)--rm[Remove intermediate containers after a successful build]" \ 925 "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " \ 926 "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \ 927 "($help)*--ulimit=[ulimit options]:ulimit: " \ 928 "($help)--userns=[Container user namespace]:user namespace:(host)" \ 929 "($help -):path or URL:_directories" && ret=0 930 ;; 931 (history) 932 _arguments $(__docker_arguments) \ 933 $opts_help \ 934 "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \ 935 "($help)--no-trunc[Do not truncate output]" \ 936 "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ 937 "($help -)*: :__docker_complete_images" && ret=0 938 ;; 939 (import) 940 _arguments $(__docker_arguments) \ 941 $opts_help \ 942 "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ 943 "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \ 944 "($help -):URL:(- http:// file://)" \ 945 "($help -): :__docker_complete_repositories_with_tags" && ret=0 946 ;; 947 (inspect) 948 _arguments $(__docker_arguments) \ 949 $opts_help \ 950 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 951 "($help -)*:images:__docker_complete_images" && ret=0 952 ;; 953 (load) 954 _arguments $(__docker_arguments) \ 955 $opts_help \ 956 "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \ 957 "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0 958 ;; 959 (ls|list) 960 local state 961 _arguments $(__docker_arguments) \ 962 $opts_help \ 963 "($help -a --all)"{-a,--all}"[Show all images]" \ 964 "($help)--digests[Show digests]" \ 965 "($help)*"{-f=,--filter=}"[Filter values]:filter:->filter-options" \ 966 "($help)--format=[Pretty-print images using a Go template]:template: " \ 967 "($help)--no-trunc[Do not truncate output]" \ 968 "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ 969 "($help -): :__docker_complete_repositories" && ret=0 970 case $state in 971 (filter-options) 972 __docker_complete_images_filters && ret=0 973 ;; 974 esac 975 ;; 976 (prune) 977 _arguments $(__docker_arguments) \ 978 $opts_help \ 979 "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \ 980 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 981 ;; 982 (pull) 983 _arguments $(__docker_arguments) \ 984 $opts_help \ 985 "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \ 986 "($help)--disable-content-trust[Skip image verification]" \ 987 "($help -):name:__docker_search" && ret=0 988 ;; 989 (push) 990 _arguments $(__docker_arguments) \ 991 $opts_help \ 992 "($help)--disable-content-trust[Skip image signing]" \ 993 "($help -): :__docker_complete_images" && ret=0 994 ;; 995 (rm) 996 _arguments $(__docker_arguments) \ 997 $opts_help \ 998 "($help -f --force)"{-f,--force}"[Force removal]" \ 999 "($help)--no-prune[Do not delete untagged parents]" \ 1000 "($help -)*: :__docker_complete_images" && ret=0 1001 ;; 1002 (save) 1003 _arguments $(__docker_arguments) \ 1004 $opts_help \ 1005 "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \ 1006 "($help -)*: :__docker_complete_images" && ret=0 1007 ;; 1008 (tag) 1009 _arguments $(__docker_arguments) \ 1010 $opts_help \ 1011 "($help -):source:__docker_complete_images"\ 1012 "($help -):destination:__docker_complete_repositories_with_tags" && ret=0 1013 ;; 1014 (help) 1015 _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 1016 ;; 1017 esac 1018 1019 return ret 1020 } 1021 1022 # EO image 1023 1024 # BO network 1025 1026 __docker_network_complete_ls_filters() { 1027 [[ $PREFIX = -* ]] && return 1 1028 integer ret=1 1029 1030 if compset -P '*='; then 1031 case "${${words[-1]%=*}#*=}" in 1032 (driver) 1033 __docker_complete_info_plugins Network && ret=0 1034 ;; 1035 (id) 1036 __docker_complete_networks_ids && ret=0 1037 ;; 1038 (name) 1039 __docker_complete_networks_names && ret=0 1040 ;; 1041 (type) 1042 type_opts=('builtin' 'custom') 1043 _describe -t type-filter-opts "Type Filter Options" type_opts && ret=0 1044 ;; 1045 *) 1046 _message 'value' && ret=0 1047 ;; 1048 esac 1049 else 1050 opts=('driver' 'id' 'label' 'name' 'type') 1051 _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 1052 fi 1053 1054 return ret 1055 } 1056 1057 __docker_get_networks() { 1058 [[ $PREFIX = -* ]] && return 1 1059 integer ret=1 1060 local line s 1061 declare -a lines networks 1062 1063 type=$1; shift 1064 1065 lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}}) 1066 1067 # Parse header line to find columns 1068 local i=1 j=1 k header=${lines[1]} 1069 declare -A begin end 1070 while (( j < ${#header} - 1 )); do 1071 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1072 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1073 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1074 begin[${header[$i,$((j-1))]}]=$i 1075 end[${header[$i,$((j-1))]}]=$k 1076 done 1077 end[${header[$i,$((j-1))]}]=-1 1078 lines=(${lines[2,-1]}) 1079 1080 # Network ID 1081 if [[ $type = (ids|all) ]]; then 1082 for line in $lines; do 1083 s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}" 1084 s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" 1085 s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" 1086 networks=($networks $s) 1087 done 1088 fi 1089 1090 # Names 1091 if [[ $type = (names|all) ]]; then 1092 for line in $lines; do 1093 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1094 s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" 1095 s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" 1096 networks=($networks $s) 1097 done 1098 fi 1099 1100 _describe -t networks-list "networks" networks "$@" && ret=0 1101 return ret 1102 } 1103 1104 __docker_complete_networks() { 1105 [[ $PREFIX = -* ]] && return 1 1106 __docker_get_networks all "$@" 1107 } 1108 1109 __docker_complete_networks_ids() { 1110 [[ $PREFIX = -* ]] && return 1 1111 __docker_get_networks ids "$@" 1112 } 1113 1114 __docker_complete_networks_names() { 1115 [[ $PREFIX = -* ]] && return 1 1116 __docker_get_networks names "$@" 1117 } 1118 1119 __docker_network_commands() { 1120 local -a _docker_network_subcommands 1121 _docker_network_subcommands=( 1122 "connect:Connect a container to a network" 1123 "create:Creates a new network with a name specified by the user" 1124 "disconnect:Disconnects a container from a network" 1125 "inspect:Displays detailed information on a network" 1126 "ls:Lists all the networks created by the user" 1127 "prune:Remove all unused networks" 1128 "rm:Deletes one or more networks" 1129 ) 1130 _describe -t docker-network-commands "docker network command" _docker_network_subcommands 1131 } 1132 1133 __docker_network_subcommand() { 1134 local -a _command_args opts_help 1135 local expl help="--help" 1136 integer ret=1 1137 1138 opts_help=("(: -)--help[Print usage]") 1139 1140 case "$words[1]" in 1141 (connect) 1142 _arguments $(__docker_arguments) \ 1143 $opts_help \ 1144 "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ 1145 "($help)--ip=[IPv4 address]:IPv4: " \ 1146 "($help)--ip6=[IPv6 address]:IPv6: " \ 1147 "($help)*--link=[Add a link to another container]:link:->link" \ 1148 "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ 1149 "($help -)1:network:__docker_complete_networks" \ 1150 "($help -)2:containers:__docker_complete_containers" && ret=0 1151 1152 case $state in 1153 (link) 1154 if compset -P "*:"; then 1155 _wanted alias expl "Alias" compadd -E "" && ret=0 1156 else 1157 __docker_complete_running_containers -qS ":" && ret=0 1158 fi 1159 ;; 1160 esac 1161 ;; 1162 (create) 1163 _arguments $(__docker_arguments) -A '-*' \ 1164 $opts_help \ 1165 "($help)--attachable[Enable manual container attachment]" \ 1166 "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ 1167 "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ 1168 "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ 1169 "($help)--internal[Restricts external access to the network]" \ 1170 "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ 1171 "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ 1172 "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ 1173 "($help)--ipv6[Enable IPv6 networking]" \ 1174 "($help)*--label=[Set metadata on a network]:label=value: " \ 1175 "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ 1176 "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ 1177 "($help -)1:Network Name: " && ret=0 1178 ;; 1179 (disconnect) 1180 _arguments $(__docker_arguments) \ 1181 $opts_help \ 1182 "($help -)1:network:__docker_complete_networks" \ 1183 "($help -)2:containers:__docker_complete_containers" && ret=0 1184 ;; 1185 (inspect) 1186 _arguments $(__docker_arguments) \ 1187 $opts_help \ 1188 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1189 "($help -)*:network:__docker_complete_networks" && ret=0 1190 ;; 1191 (ls) 1192 _arguments $(__docker_arguments) \ 1193 $opts_help \ 1194 "($help)--no-trunc[Do not truncate the output]" \ 1195 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1196 "($help)--format=[Pretty-print networks using a Go template]:template: " \ 1197 "($help -q --quiet)"{-q,--quiet}"[Only display numeric IDs]" && ret=0 1198 case $state in 1199 (filter-options) 1200 __docker_network_complete_ls_filters && ret=0 1201 ;; 1202 esac 1203 ;; 1204 (prune) 1205 _arguments $(__docker_arguments) \ 1206 $opts_help \ 1207 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 1208 ;; 1209 (rm) 1210 _arguments $(__docker_arguments) \ 1211 $opts_help \ 1212 "($help -)*:network:__docker_complete_networks" && ret=0 1213 ;; 1214 (help) 1215 _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 1216 ;; 1217 esac 1218 1219 return ret 1220 } 1221 1222 # EO network 1223 1224 # BO node 1225 1226 __docker_node_complete_ls_filters() { 1227 [[ $PREFIX = -* ]] && return 1 1228 integer ret=1 1229 1230 if compset -P '*='; then 1231 case "${${words[-1]%=*}#*=}" in 1232 (id) 1233 __docker_complete_nodes_ids && ret=0 1234 ;; 1235 (membership) 1236 membership_opts=('accepted' 'pending' 'rejected') 1237 _describe -t membership-opts "membership options" membership_opts && ret=0 1238 ;; 1239 (name) 1240 __docker_complete_nodes_names && ret=0 1241 ;; 1242 (role) 1243 role_opts=('manager' 'worker') 1244 _describe -t role-opts "role options" role_opts && ret=0 1245 ;; 1246 *) 1247 _message 'value' && ret=0 1248 ;; 1249 esac 1250 else 1251 opts=('id' 'label' 'membership' 'name' 'role') 1252 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1253 fi 1254 1255 return ret 1256 } 1257 1258 __docker_node_complete_ps_filters() { 1259 [[ $PREFIX = -* ]] && return 1 1260 integer ret=1 1261 1262 if compset -P '*='; then 1263 case "${${words[-1]%=*}#*=}" in 1264 (desired-state) 1265 state_opts=('accepted' 'running') 1266 _describe -t state-opts "desired state options" state_opts && ret=0 1267 ;; 1268 *) 1269 _message 'value' && ret=0 1270 ;; 1271 esac 1272 else 1273 opts=('desired-state' 'id' 'label' 'name') 1274 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1275 fi 1276 1277 return ret 1278 } 1279 1280 __docker_nodes() { 1281 [[ $PREFIX = -* ]] && return 1 1282 integer ret=1 1283 local line s 1284 declare -a lines nodes args 1285 1286 type=$1; shift 1287 filter=$1; shift 1288 [[ $filter != "none" ]] && args=("-f $filter") 1289 1290 lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) 1291 # Parse header line to find columns 1292 local i=1 j=1 k header=${lines[1]} 1293 declare -A begin end 1294 while (( j < ${#header} - 1 )); do 1295 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1296 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1297 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1298 begin[${header[$i,$((j-1))]}]=$i 1299 end[${header[$i,$((j-1))]}]=$k 1300 done 1301 end[${header[$i,$((j-1))]}]=-1 1302 lines=(${lines[2,-1]}) 1303 1304 # Node ID 1305 if [[ $type = (ids|all) ]]; then 1306 for line in $lines; do 1307 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1308 nodes=($nodes $s) 1309 done 1310 fi 1311 1312 # Names 1313 if [[ $type = (names|all) ]]; then 1314 for line in $lines; do 1315 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1316 nodes=($nodes $s) 1317 done 1318 fi 1319 1320 _describe -t nodes-list "nodes" nodes "$@" && ret=0 1321 return ret 1322 } 1323 1324 __docker_complete_nodes() { 1325 [[ $PREFIX = -* ]] && return 1 1326 __docker_nodes all none "$@" 1327 } 1328 1329 __docker_complete_nodes_ids() { 1330 [[ $PREFIX = -* ]] && return 1 1331 __docker_nodes ids none "$@" 1332 } 1333 1334 __docker_complete_nodes_names() { 1335 [[ $PREFIX = -* ]] && return 1 1336 __docker_nodes names none "$@" 1337 } 1338 1339 __docker_complete_pending_nodes() { 1340 [[ $PREFIX = -* ]] && return 1 1341 __docker_nodes all "membership=pending" "$@" 1342 } 1343 1344 __docker_complete_manager_nodes() { 1345 [[ $PREFIX = -* ]] && return 1 1346 __docker_nodes all "role=manager" "$@" 1347 } 1348 1349 __docker_complete_worker_nodes() { 1350 [[ $PREFIX = -* ]] && return 1 1351 __docker_nodes all "role=worker" "$@" 1352 } 1353 1354 __docker_node_commands() { 1355 local -a _docker_node_subcommands 1356 _docker_node_subcommands=( 1357 "demote:Demote a node as manager in the swarm" 1358 "inspect:Display detailed information on one or more nodes" 1359 "ls:List nodes in the swarm" 1360 "promote:Promote a node as manager in the swarm" 1361 "rm:Remove one or more nodes from the swarm" 1362 "ps:List tasks running on one or more nodes, defaults to current node" 1363 "update:Update a node" 1364 ) 1365 _describe -t docker-node-commands "docker node command" _docker_node_subcommands 1366 } 1367 1368 __docker_node_subcommand() { 1369 local -a _command_args opts_help 1370 local expl help="--help" 1371 integer ret=1 1372 1373 opts_help=("(: -)--help[Print usage]") 1374 1375 case "$words[1]" in 1376 (rm|remove) 1377 _arguments $(__docker_arguments) \ 1378 $opts_help \ 1379 "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ 1380 "($help -)*:node:__docker_complete_pending_nodes" && ret=0 1381 ;; 1382 (demote) 1383 _arguments $(__docker_arguments) \ 1384 $opts_help \ 1385 "($help -)*:node:__docker_complete_manager_nodes" && ret=0 1386 ;; 1387 (inspect) 1388 _arguments $(__docker_arguments) \ 1389 $opts_help \ 1390 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1391 "($help)--pretty[Print the information in a human friendly format]" \ 1392 "($help -)*:node:__docker_complete_nodes" && ret=0 1393 ;; 1394 (ls|list) 1395 _arguments $(__docker_arguments) \ 1396 $opts_help \ 1397 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1398 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1399 case $state in 1400 (filter-options) 1401 __docker_node_complete_ls_filters && ret=0 1402 ;; 1403 esac 1404 ;; 1405 (promote) 1406 _arguments $(__docker_arguments) \ 1407 $opts_help \ 1408 "($help -)*:node:__docker_complete_worker_nodes" && ret=0 1409 ;; 1410 (ps) 1411 _arguments $(__docker_arguments) \ 1412 $opts_help \ 1413 "($help -a --all)"{-a,--all}"[Display all instances]" \ 1414 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1415 "($help)--no-resolve[Do not map IDs to Names]" \ 1416 "($help)--no-trunc[Do not truncate output]" \ 1417 "($help -)*:node:__docker_complete_nodes" && ret=0 1418 case $state in 1419 (filter-options) 1420 __docker_node_complete_ps_filters && ret=0 1421 ;; 1422 esac 1423 ;; 1424 (update) 1425 _arguments $(__docker_arguments) \ 1426 $opts_help \ 1427 "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ 1428 "($help)*--label-add=[Add or update a node label]:key=value: " \ 1429 "($help)*--label-rm=[Remove a node label if exists]:label: " \ 1430 "($help)--role=[Role of the node]:role:(manager worker)" \ 1431 "($help -)1:node:__docker_complete_nodes" && ret=0 1432 ;; 1433 (help) 1434 _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 1435 ;; 1436 esac 1437 1438 return ret 1439 } 1440 1441 # EO node 1442 1443 # BO plugin 1444 1445 __docker_complete_plugins() { 1446 [[ $PREFIX = -* ]] && return 1 1447 integer ret=1 1448 local line s 1449 declare -a lines plugins 1450 1451 lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls)"$'\n'}}) 1452 1453 # Parse header line to find columns 1454 local i=1 j=1 k header=${lines[1]} 1455 declare -A begin end 1456 while (( j < ${#header} - 1 )); do 1457 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1458 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1459 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1460 begin[${header[$i,$((j-1))]}]=$i 1461 end[${header[$i,$((j-1))]}]=$k 1462 done 1463 end[${header[$i,$((j-1))]}]=-1 1464 lines=(${lines[2,-1]}) 1465 1466 # Name 1467 for line in $lines; do 1468 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1469 s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" 1470 plugins=($plugins $s) 1471 done 1472 1473 _describe -t plugins-list "plugins" plugins "$@" && ret=0 1474 return ret 1475 } 1476 1477 __docker_plugin_commands() { 1478 local -a _docker_plugin_subcommands 1479 _docker_plugin_subcommands=( 1480 "disable:Disable a plugin" 1481 "enable:Enable a plugin" 1482 "inspect:Return low-level information about a plugin" 1483 "install:Install a plugin" 1484 "ls:List plugins" 1485 "push:Push a plugin" 1486 "rm:Remove a plugin" 1487 "set:Change settings for a plugin" 1488 ) 1489 _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands 1490 } 1491 1492 __docker_plugin_subcommand() { 1493 local -a _command_args opts_help 1494 local expl help="--help" 1495 integer ret=1 1496 1497 opts_help=("(: -)--help[Print usage]") 1498 1499 case "$words[1]" in 1500 (disable|enable|inspect|install|ls|push|rm) 1501 _arguments $(__docker_arguments) \ 1502 $opts_help \ 1503 "($help -)1:plugin:__docker_complete_plugins" && ret=0 1504 ;; 1505 (set) 1506 _arguments $(__docker_arguments) \ 1507 $opts_help \ 1508 "($help -)1:plugin:__docker_complete_plugins" \ 1509 "($help-)*:key=value: " && ret=0 1510 ;; 1511 (help) 1512 _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 1513 ;; 1514 esac 1515 1516 return ret 1517 } 1518 1519 # EO plugin 1520 1521 # BO secret 1522 1523 __docker_secrets() { 1524 [[ $PREFIX = -* ]] && return 1 1525 integer ret=1 1526 local line s 1527 declare -a lines secrets 1528 1529 type=$1; shift 1530 1531 lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) 1532 1533 # Parse header line to find columns 1534 local i=1 j=1 k header=${lines[1]} 1535 declare -A begin end 1536 while (( j < ${#header} - 1 )); do 1537 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1538 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1539 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1540 begin[${header[$i,$((j-1))]}]=$i 1541 end[${header[$i,$((j-1))]}]=$k 1542 done 1543 end[${header[$i,$((j-1))]}]=-1 1544 lines=(${lines[2,-1]}) 1545 1546 # ID 1547 if [[ $type = (ids|all) ]]; then 1548 for line in $lines; do 1549 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1550 secrets=($secrets $s) 1551 done 1552 fi 1553 1554 # Names 1555 if [[ $type = (names|all) ]]; then 1556 for line in $lines; do 1557 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1558 secrets=($secrets $s) 1559 done 1560 fi 1561 1562 _describe -t secrets-list "secrets" secrets "$@" && ret=0 1563 return ret 1564 } 1565 1566 __docker_complete_secrets() { 1567 [[ $PREFIX = -* ]] && return 1 1568 __docker_secrets all "$@" 1569 } 1570 1571 __docker_secret_commands() { 1572 local -a _docker_secret_subcommands 1573 _docker_secret_subcommands=( 1574 "create:Create a secret using stdin as content" 1575 "inspect:Display detailed information on one or more secrets" 1576 "ls:List secrets" 1577 "rm:Remove one or more secrets" 1578 ) 1579 _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands 1580 } 1581 1582 __docker_secret_subcommand() { 1583 local -a _command_args opts_help 1584 local expl help="--help" 1585 integer ret=1 1586 1587 opts_help=("(: -)--help[Print usage]") 1588 1589 case "$words[1]" in 1590 (create) 1591 _arguments $(__docker_arguments) \ 1592 $opts_help \ 1593 "($help)*"{-l=,--label=}"[Secret labels]:label: " \ 1594 "($help -):secret: " && ret=0 1595 ;; 1596 (inspect) 1597 _arguments $(__docker_arguments) \ 1598 $opts_help \ 1599 "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ 1600 "($help -)*:secret:__docker_complete_secrets" && ret=0 1601 ;; 1602 (ls|list) 1603 _arguments $(__docker_arguments) \ 1604 $opts_help \ 1605 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1606 ;; 1607 (rm|remove) 1608 _arguments $(__docker_arguments) \ 1609 $opts_help \ 1610 "($help -)*:secret:__docker_complete_secrets" && ret=0 1611 ;; 1612 (help) 1613 _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 1614 ;; 1615 esac 1616 1617 return ret 1618 } 1619 1620 # EO secret 1621 1622 # BO service 1623 1624 __docker_service_complete_ls_filters() { 1625 [[ $PREFIX = -* ]] && return 1 1626 integer ret=1 1627 1628 if compset -P '*='; then 1629 case "${${words[-1]%=*}#*=}" in 1630 (id) 1631 __docker_complete_services_ids && ret=0 1632 ;; 1633 (name) 1634 __docker_complete_services_names && ret=0 1635 ;; 1636 *) 1637 _message 'value' && ret=0 1638 ;; 1639 esac 1640 else 1641 opts=('id' 'label' 'name') 1642 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1643 fi 1644 1645 return ret 1646 } 1647 1648 __docker_service_complete_ps_filters() { 1649 [[ $PREFIX = -* ]] && return 1 1650 integer ret=1 1651 1652 if compset -P '*='; then 1653 case "${${words[-1]%=*}#*=}" in 1654 (desired-state) 1655 state_opts=('accepted' 'running') 1656 _describe -t state-opts "desired state options" state_opts && ret=0 1657 ;; 1658 *) 1659 _message 'value' && ret=0 1660 ;; 1661 esac 1662 else 1663 opts=('desired-state' 'id' 'label' 'name') 1664 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1665 fi 1666 1667 return ret 1668 } 1669 1670 __docker_services() { 1671 [[ $PREFIX = -* ]] && return 1 1672 integer ret=1 1673 local line s 1674 declare -a lines services 1675 1676 type=$1; shift 1677 1678 lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) 1679 1680 # Parse header line to find columns 1681 local i=1 j=1 k header=${lines[1]} 1682 declare -A begin end 1683 while (( j < ${#header} - 1 )); do 1684 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1685 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1686 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1687 begin[${header[$i,$((j-1))]}]=$i 1688 end[${header[$i,$((j-1))]}]=$k 1689 done 1690 end[${header[$i,$((j-1))]}]=-1 1691 lines=(${lines[2,-1]}) 1692 1693 # Service ID 1694 if [[ $type = (ids|all) ]]; then 1695 for line in $lines; do 1696 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1697 s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" 1698 services=($services $s) 1699 done 1700 fi 1701 1702 # Names 1703 if [[ $type = (names|all) ]]; then 1704 for line in $lines; do 1705 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1706 s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" 1707 services=($services $s) 1708 done 1709 fi 1710 1711 _describe -t services-list "services" services "$@" && ret=0 1712 return ret 1713 } 1714 1715 __docker_complete_services() { 1716 [[ $PREFIX = -* ]] && return 1 1717 __docker_services all "$@" 1718 } 1719 1720 __docker_complete_services_ids() { 1721 [[ $PREFIX = -* ]] && return 1 1722 __docker_services ids "$@" 1723 } 1724 1725 __docker_complete_services_names() { 1726 [[ $PREFIX = -* ]] && return 1 1727 __docker_services names "$@" 1728 } 1729 1730 __docker_service_commands() { 1731 local -a _docker_service_subcommands 1732 _docker_service_subcommands=( 1733 "create:Create a new service" 1734 "inspect:Display detailed information on one or more services" 1735 "ls:List services" 1736 "rm:Remove one or more services" 1737 "scale:Scale one or multiple replicated services" 1738 "ps:List the tasks of a service" 1739 "update:Update a service" 1740 ) 1741 _describe -t docker-service-commands "docker service command" _docker_service_subcommands 1742 } 1743 1744 __docker_service_subcommand() { 1745 local -a _command_args opts_help opts_create_update 1746 local expl help="--help" 1747 integer ret=1 1748 1749 opts_help=("(: -)--help[Print usage]") 1750 opts_create_update=( 1751 "($help)*--constraint=[Placement constraints]:constraint: " 1752 "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" 1753 "($help)*"{-e=,--env=}"[Set environment variables]:env: " 1754 "($help)--health-cmd=[Command to run to check health]:command: " 1755 "($help)--health-interval=[Time between running the check]:time: " 1756 "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" 1757 "($help)--health-timeout=[Maximum time to allow one check to run]:time: " 1758 "($help)--hostname=[Service container hostname]:hostname: " \ 1759 "($help)*--label=[Service labels]:label: " 1760 "($help)--limit-cpu=[Limit CPUs]:value: " 1761 "($help)--limit-memory=[Limit Memory]:value: " 1762 "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" 1763 "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" 1764 "($help)*--mount=[Attach a filesystem mount to the service]:mount: " 1765 "($help)*--network=[Network attachments]:network: " 1766 "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" 1767 "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " 1768 "($help)--replicas=[Number of tasks]:replicas: " 1769 "($help)--reserve-cpu=[Reserve CPUs]:value: " 1770 "($help)--reserve-memory=[Reserve Memory]:value: " 1771 "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" 1772 "($help)--restart-delay=[Delay between restart attempts]:delay: " 1773 "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " 1774 "($help)--restart-window=[Window used to evaluate the restart policy]:window: " 1775 "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" 1776 "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " 1777 "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" 1778 "($help)--update-delay=[Delay between updates]:delay: " 1779 "($help)--update-failure-action=[Action on update failure]:mode:(pause continue)" 1780 "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " 1781 "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " 1782 "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " 1783 "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" 1784 "($help)--with-registry-auth[Send registry authentication details to swarm agents]" 1785 "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" 1786 ) 1787 1788 case "$words[1]" in 1789 (create) 1790 _arguments $(__docker_arguments) \ 1791 $opts_help \ 1792 $opts_create_update \ 1793 "($help)*--container-label=[Container labels]:label: " \ 1794 "($help)*--dns=[Set custom DNS servers]:DNS: " \ 1795 "($help)*--dns-option=[Set DNS options]:DNS option: " \ 1796 "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ 1797 "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ 1798 "($help)--mode=[Service Mode]:mode:(global replicated)" \ 1799 "($help)--name=[Service name]:name: " \ 1800 "($help)*--publish=[Publish a port]:port: " \ 1801 "($help -): :__docker_complete_images" \ 1802 "($help -):command: _command_names -e" \ 1803 "($help -)*::arguments: _normal" && ret=0 1804 ;; 1805 (inspect) 1806 _arguments $(__docker_arguments) \ 1807 $opts_help \ 1808 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1809 "($help)--pretty[Print the information in a human friendly format]" \ 1810 "($help -)*:service:__docker_complete_services" && ret=0 1811 ;; 1812 (ls|list) 1813 _arguments $(__docker_arguments) \ 1814 $opts_help \ 1815 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:->filter-options" \ 1816 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1817 case $state in 1818 (filter-options) 1819 __docker_service_complete_ls_filters && ret=0 1820 ;; 1821 esac 1822 ;; 1823 (rm|remove) 1824 _arguments $(__docker_arguments) \ 1825 $opts_help \ 1826 "($help -)*:service:__docker_complete_services" && ret=0 1827 ;; 1828 (scale) 1829 _arguments $(__docker_arguments) \ 1830 $opts_help \ 1831 "($help -)*:service:->values" && ret=0 1832 case $state in 1833 (values) 1834 if compset -P '*='; then 1835 _message 'replicas' && ret=0 1836 else 1837 __docker_complete_services -qS "=" 1838 fi 1839 ;; 1840 esac 1841 ;; 1842 (ps) 1843 _arguments $(__docker_arguments) \ 1844 $opts_help \ 1845 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1846 "($help)--no-resolve[Do not map IDs to Names]" \ 1847 "($help)--no-trunc[Do not truncate output]" \ 1848 "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ 1849 "($help -)1:service:__docker_complete_services" && ret=0 1850 case $state in 1851 (filter-options) 1852 __docker_service_complete_ps_filters && ret=0 1853 ;; 1854 esac 1855 ;; 1856 (update) 1857 _arguments $(__docker_arguments) \ 1858 $opts_help \ 1859 $opts_create_update \ 1860 "($help)--arg=[Service command args]:arguments: _normal" \ 1861 "($help)*--container-label-add=[Add or update container labels]:label: " \ 1862 "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ 1863 "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ 1864 "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ 1865 "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ 1866 "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ 1867 "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ 1868 "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ 1869 "($help)--force[Force update]" \ 1870 "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ 1871 "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ 1872 "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ 1873 "($help)*--publish-add=[Add or update a port]:port: " \ 1874 "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \ 1875 "($help)--rollback[Rollback to previous specification]" \ 1876 "($help -)1:service:__docker_complete_services" && ret=0 1877 ;; 1878 (help) 1879 _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 1880 ;; 1881 esac 1882 1883 return ret 1884 } 1885 1886 # EO service 1887 1888 # BO stack 1889 1890 __docker_stack_complete_ps_filters() { 1891 [[ $PREFIX = -* ]] && return 1 1892 integer ret=1 1893 1894 if compset -P '*='; then 1895 case "${${words[-1]%=*}#*=}" in 1896 (desired-state) 1897 state_opts=('accepted' 'running') 1898 _describe -t state-opts "desired state options" state_opts && ret=0 1899 ;; 1900 *) 1901 _message 'value' && ret=0 1902 ;; 1903 esac 1904 else 1905 opts=('desired-state' 'id' 'name') 1906 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1907 fi 1908 1909 return ret 1910 } 1911 1912 __docker_stack_complete_services_filters() { 1913 [[ $PREFIX = -* ]] && return 1 1914 integer ret=1 1915 1916 if compset -P '*='; then 1917 case "${${words[-1]%=*}#*=}" in 1918 *) 1919 _message 'value' && ret=0 1920 ;; 1921 esac 1922 else 1923 opts=('id' 'label' 'name') 1924 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1925 fi 1926 1927 return ret 1928 } 1929 1930 __docker_stacks() { 1931 [[ $PREFIX = -* ]] && return 1 1932 integer ret=1 1933 local line s 1934 declare -a lines stacks 1935 1936 lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) 1937 1938 # Parse header line to find columns 1939 local i=1 j=1 k header=${lines[1]} 1940 declare -A begin end 1941 while (( j < ${#header} - 1 )); do 1942 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1943 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1944 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1945 begin[${header[$i,$((j-1))]}]=$i 1946 end[${header[$i,$((j-1))]}]=$k 1947 done 1948 end[${header[$i,$((j-1))]}]=-1 1949 lines=(${lines[2,-1]}) 1950 1951 # Service ID 1952 for line in $lines; do 1953 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1954 stacks=($stacks $s) 1955 done 1956 1957 _describe -t stacks-list "stacks" stacks "$@" && ret=0 1958 return ret 1959 } 1960 1961 __docker_complete_stacks() { 1962 [[ $PREFIX = -* ]] && return 1 1963 __docker_stacks "$@" 1964 } 1965 1966 __docker_stack_commands() { 1967 local -a _docker_stack_subcommands 1968 _docker_stack_subcommands=( 1969 "deploy:Deploy a new stack or update an existing stack" 1970 "ls:List stacks" 1971 "ps:List the tasks in the stack" 1972 "rm:Remove the stack" 1973 "services:List the services in the stack" 1974 ) 1975 _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands 1976 } 1977 1978 __docker_stack_subcommand() { 1979 local -a _command_args opts_help 1980 local expl help="--help" 1981 integer ret=1 1982 1983 opts_help=("(: -)--help[Print usage]") 1984 1985 case "$words[1]" in 1986 (deploy|up) 1987 _arguments $(__docker_arguments) \ 1988 $opts_help \ 1989 "($help)--bundle-file=[Path to a Distributed Application Bundle file]:dab:_files -g \"*.dab\"" \ 1990 "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file]:compose file:_files -g \"*.(yml|yaml)\"" \ 1991 "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ 1992 "($help -):stack:__docker_complete_stacks" && ret=0 1993 ;; 1994 (ls|list) 1995 _arguments $(__docker_arguments) \ 1996 $opts_help && ret=0 1997 ;; 1998 (ps) 1999 _arguments $(__docker_arguments) \ 2000 $opts_help \ 2001 "($help -a --all)"{-a,--all}"[Display all tasks]" \ 2002 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ 2003 "($help)--no-resolve[Do not map IDs to Names]" \ 2004 "($help)--no-trunc[Do not truncate output]" \ 2005 "($help -):stack:__docker_complete_stacks" && ret=0 2006 ;; 2007 (rm|remove|down) 2008 _arguments $(__docker_arguments) \ 2009 $opts_help \ 2010 "($help -):stack:__docker_complete_stacks" && ret=0 2011 ;; 2012 (services) 2013 _arguments $(__docker_arguments) \ 2014 $opts_help \ 2015 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ 2016 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ 2017 "($help -):stack:__docker_complete_stacks" && ret=0 2018 ;; 2019 (help) 2020 _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 2021 ;; 2022 esac 2023 2024 return ret 2025 } 2026 2027 # EO stack 2028 2029 # BO swarm 2030 2031 __docker_swarm_commands() { 2032 local -a _docker_swarm_subcommands 2033 _docker_swarm_subcommands=( 2034 "init:Initialize a swarm" 2035 "join:Join a swarm as a node and/or manager" 2036 "join-token:Manage join tokens" 2037 "leave:Leave a swarm" 2038 "update:Update the swarm" 2039 ) 2040 _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands 2041 } 2042 2043 __docker_swarm_subcommand() { 2044 local -a _command_args opts_help 2045 local expl help="--help" 2046 integer ret=1 2047 2048 opts_help=("(: -)--help[Print usage]") 2049 2050 case "$words[1]" in 2051 (init) 2052 _arguments $(__docker_arguments) \ 2053 $opts_help \ 2054 "($help)--advertise-addr[Advertised address]:ip\:port: " \ 2055 "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ 2056 "($help)--force-new-cluster[Force create a new cluster from current state]" \ 2057 "($help)--listen-addr=[Listen address]:ip\:port: " \ 2058 "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ 2059 "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ 2060 "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 2061 ;; 2062 (join) 2063 _arguments $(__docker_arguments) \ 2064 $opts_help \ 2065 "($help)--advertise-addr[Advertised address]:ip\:port: " \ 2066 "($help)--listen-addr=[Listen address]:ip\:port: " \ 2067 "($help)--token=[Token for entry into the swarm]:secret: " \ 2068 "($help -):host\:port: " && ret=0 2069 ;; 2070 (join-token) 2071 _arguments $(__docker_arguments) \ 2072 $opts_help \ 2073 "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ 2074 "($help)--rotate[Rotate join token]" \ 2075 "($help -):role:(manager worker)" && ret=0 2076 ;; 2077 (leave) 2078 _arguments $(__docker_arguments) \ 2079 $opts_help \ 2080 "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 2081 ;; 2082 (update) 2083 _arguments $(__docker_arguments) \ 2084 $opts_help \ 2085 "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ 2086 "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ 2087 "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ 2088 "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ 2089 "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ 2090 "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 2091 ;; 2092 (help) 2093 _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 2094 ;; 2095 esac 2096 2097 return ret 2098 } 2099 2100 # EO swarm 2101 2102 # BO system 2103 2104 __docker_system_commands() { 2105 local -a _docker_system_subcommands 2106 _docker_system_subcommands=( 2107 "df:Show docker filesystem usage" 2108 "events:Get real time events from the server" 2109 "info:Display system-wide information" 2110 "prune:Remove unused data" 2111 ) 2112 _describe -t docker-system-commands "docker system command" _docker_system_subcommands 2113 } 2114 2115 __docker_system_subcommand() { 2116 local -a _command_args opts_help 2117 local expl help="--help" 2118 integer ret=1 2119 2120 opts_help=("(: -)--help[Print usage]") 2121 2122 case "$words[1]" in 2123 (df) 2124 _arguments $(__docker_arguments) \ 2125 $opts_help \ 2126 "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 2127 ;; 2128 (events) 2129 _arguments $(__docker_arguments) \ 2130 $opts_help \ 2131 "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ 2132 "($help)--since=[Events created since this timestamp]:timestamp: " \ 2133 "($help)--until=[Events created until this timestamp]:timestamp: " \ 2134 "($help)--format=[Format the output using the given go template]:template: " && ret=0 2135 ;; 2136 (info) 2137 _arguments $(__docker_arguments) \ 2138 $opts_help \ 2139 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 2140 ;; 2141 (prune) 2142 _arguments $(__docker_arguments) \ 2143 $opts_help \ 2144 "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ 2145 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 2146 ;; 2147 (help) 2148 _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 2149 ;; 2150 esac 2151 2152 return ret 2153 } 2154 2155 # EO system 2156 2157 # BO volume 2158 2159 __docker_volume_complete_ls_filters() { 2160 [[ $PREFIX = -* ]] && return 1 2161 integer ret=1 2162 2163 if compset -P '*='; then 2164 case "${${words[-1]%=*}#*=}" in 2165 (dangling) 2166 dangling_opts=('true' 'false') 2167 _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 2168 ;; 2169 (driver) 2170 __docker_complete_info_plugins Volume && ret=0 2171 ;; 2172 (name) 2173 __docker_complete_volumes && ret=0 2174 ;; 2175 *) 2176 _message 'value' && ret=0 2177 ;; 2178 esac 2179 else 2180 opts=('dangling' 'driver' 'label' 'name') 2181 _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 2182 fi 2183 2184 return ret 2185 } 2186 2187 __docker_complete_volumes() { 2188 [[ $PREFIX = -* ]] && return 1 2189 integer ret=1 2190 declare -a lines volumes 2191 2192 lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) 2193 2194 # Parse header line to find columns 2195 local i=1 j=1 k header=${lines[1]} 2196 declare -A begin end 2197 while (( j < ${#header} - 1 )); do 2198 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 2199 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 2200 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 2201 begin[${header[$i,$((j-1))]}]=$i 2202 end[${header[$i,$((j-1))]}]=$k 2203 done 2204 end[${header[$i,$((j-1))]}]=-1 2205 lines=(${lines[2,-1]}) 2206 2207 # Names 2208 local line s 2209 for line in $lines; do 2210 s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" 2211 s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" 2212 volumes=($volumes $s) 2213 done 2214 2215 _describe -t volumes-list "volumes" volumes && ret=0 2216 return ret 2217 } 2218 2219 __docker_volume_commands() { 2220 local -a _docker_volume_subcommands 2221 _docker_volume_subcommands=( 2222 "create:Create a volume" 2223 "inspect:Display detailed information on one or more volumes" 2224 "ls:List volumes" 2225 "prune:Remove all unused volumes" 2226 "rm:Remove one or more volumes" 2227 ) 2228 _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands 2229 } 2230 2231 __docker_volume_subcommand() { 2232 local -a _command_args opts_help 2233 local expl help="--help" 2234 integer ret=1 2235 2236 opts_help=("(: -)--help[Print usage]") 2237 2238 case "$words[1]" in 2239 (create) 2240 _arguments $(__docker_arguments) -A '-*' \ 2241 $opts_help \ 2242 "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ 2243 "($help)*--label=[Set metadata for a volume]:label=value: " \ 2244 "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ 2245 "($help -)1:Volume name: " && ret=0 2246 ;; 2247 (inspect) 2248 _arguments $(__docker_arguments) \ 2249 $opts_help \ 2250 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 2251 "($help -)1:volume:__docker_complete_volumes" && ret=0 2252 ;; 2253 (ls) 2254 _arguments $(__docker_arguments) \ 2255 $opts_help \ 2256 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 2257 "($help)--format=[Pretty-print volumes using a Go template]:template: " \ 2258 "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 2259 case $state in 2260 (filter-options) 2261 __docker_volume_complete_ls_filters && ret=0 2262 ;; 2263 esac 2264 ;; 2265 (prune) 2266 _arguments $(__docker_arguments) \ 2267 $opts_help \ 2268 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 2269 ;; 2270 (rm) 2271 _arguments $(__docker_arguments) \ 2272 $opts_help \ 2273 "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ 2274 "($help -):volume:__docker_complete_volumes" && ret=0 2275 ;; 2276 (help) 2277 _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 2278 ;; 2279 esac 2280 2281 return ret 2282 } 2283 2284 # EO volume 2285 2286 __docker_caching_policy() { 2287 oldp=( "$1"(Nmh+1) ) # 1 hour 2288 (( $#oldp )) 2289 } 2290 2291 __docker_commands() { 2292 local cache_policy 2293 2294 zstyle -s ":completion:${curcontext}:" cache-policy cache_policy 2295 if [[ -z "$cache_policy" ]]; then 2296 zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy 2297 fi 2298 2299 if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands) \ 2300 && ! _retrieve_cache docker_subcommands; 2301 then 2302 local -a lines 2303 lines=(${(f)"$(_call_program commands docker 2>&1)"}) 2304 _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/ ##/:}) 2305 _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command') 2306 (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands 2307 fi 2308 _describe -t docker-commands "docker command" _docker_subcommands 2309 } 2310 2311 __docker_subcommand() { 2312 local -a _command_args opts_help 2313 local expl help="--help" 2314 integer ret=1 2315 2316 opts_help=("(: -)--help[Print usage]") 2317 2318 case "$words[1]" in 2319 (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) 2320 __docker_container_subcommand && ret=0 2321 ;; 2322 (build|history|import|load|pull|push|save|tag) 2323 __docker_image_subcommand && ret=0 2324 ;; 2325 (container) 2326 local curcontext="$curcontext" state 2327 _arguments $(__docker_arguments) \ 2328 $opts_help \ 2329 "($help -): :->command" \ 2330 "($help -)*:: :->option-or-argument" && ret=0 2331 2332 case $state in 2333 (command) 2334 __docker_container_commands && ret=0 2335 ;; 2336 (option-or-argument) 2337 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2338 __docker_container_subcommand && ret=0 2339 ;; 2340 esac 2341 ;; 2342 (daemon) 2343 _arguments $(__docker_arguments) \ 2344 $opts_help \ 2345 "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ 2346 "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ 2347 "($help)*--authorization-plugin=[Authorization plugins to load]" \ 2348 "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ 2349 "($help)--bip=[Network bridge IP]:IP address: " \ 2350 "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ 2351 "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \ 2352 "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \ 2353 "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \ 2354 "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ 2355 "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ 2356 "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ 2357 "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ 2358 "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ 2359 "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ 2360 "($help)--disable-legacy-registry[Disable contacting legacy registries]" \ 2361 "($help)*--dns=[DNS server to use]:DNS: " \ 2362 "($help)*--dns-opt=[DNS options to use]:DNS option: " \ 2363 "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ 2364 "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ 2365 "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ 2366 "($help)--experimental[Enable experimental features]" \ 2367 "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ 2368 "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ 2369 "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ 2370 "($help -g --graph)"{-g=,--graph=}"[Root of the Docker runtime]:path:_directories" \ 2371 "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ 2372 "($help)--icc[Enable inter-container communication]" \ 2373 "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ 2374 "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ 2375 "($help)--ip=[Default IP when binding container ports]" \ 2376 "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ 2377 "($help)--ip-masq[Enable IP masquerading]" \ 2378 "($help)--iptables[Enable addition of iptables rules]" \ 2379 "($help)--ipv6[Enable IPv6 networking]" \ 2380 "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ 2381 "($help)*--label=[Key=value labels]:label: " \ 2382 "($help)--live-restore[Enable live restore of docker when containers are still running]" \ 2383 "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ 2384 "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ 2385 "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \ 2386 "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \ 2387 "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ 2388 "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ 2389 "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ 2390 "($help)--raw-logs[Full timestamps without ANSI coloring]" \ 2391 "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \ 2392 "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ 2393 "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \ 2394 "($help)--selinux-enabled[Enable selinux support]" \ 2395 "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ 2396 "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ 2397 "($help)--tls[Use TLS]" \ 2398 "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ 2399 "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ 2400 "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ 2401 "($help)--tlsverify[Use TLS and verify the remote]" \ 2402 "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \ 2403 "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ 2404 "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" && ret=0 2405 2406 case $state in 2407 (cluster-store) 2408 if compset -P '*://'; then 2409 _message 'host:port' && ret=0 2410 else 2411 store=('consul' 'etcd' 'zk') 2412 _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0 2413 fi 2414 ;; 2415 (cluster-store-options) 2416 if compset -P '*='; then 2417 _files && ret=0 2418 else 2419 opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path') 2420 _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0 2421 fi 2422 ;; 2423 (users-groups) 2424 if compset -P '*:'; then 2425 _groups && ret=0 2426 else 2427 _describe -t userns-default "default Docker user management" '(default)' && ret=0 2428 _users && ret=0 2429 fi 2430 ;; 2431 esac 2432 ;; 2433 (events|info) 2434 __docker_system_subcommand && ret=0 2435 ;; 2436 (image) 2437 local curcontext="$curcontext" state 2438 _arguments $(__docker_arguments) \ 2439 $opts_help \ 2440 "($help -): :->command" \ 2441 "($help -)*:: :->option-or-argument" && ret=0 2442 2443 case $state in 2444 (command) 2445 __docker_image_commands && ret=0 2446 ;; 2447 (option-or-argument) 2448 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2449 __docker_image_subcommand && ret=0 2450 ;; 2451 esac 2452 ;; 2453 (images) 2454 words[1]='ls' 2455 __docker_image_subcommand && ret=0 2456 ;; 2457 (inspect) 2458 local state 2459 _arguments $(__docker_arguments) \ 2460 $opts_help \ 2461 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 2462 "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ 2463 "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \ 2464 "($help -)*: :->values" && ret=0 2465 2466 case $state in 2467 (values) 2468 if [[ ${words[(r)--type=container]} == --type=container ]]; then 2469 __docker_complete_containers && ret=0 2470 elif [[ ${words[(r)--type=image]} == --type=image ]]; then 2471 __docker_complete_images && ret=0 2472 elif [[ ${words[(r)--type=network]} == --type=network ]]; then 2473 __docker_complete_networks && ret=0 2474 elif [[ ${words[(r)--type=node]} == --type=node ]]; then 2475 __docker_complete_nodes && ret=0 2476 elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then 2477 __docker_complete_plugins && ret=0 2478 elif [[ ${words[(r)--type=service]} == --type=service ]]; then 2479 __docker_complete_services && ret=0 2480 elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then 2481 __docker_complete_volumes && ret=0 2482 else 2483 __docker_complete_containers 2484 __docker_complete_images 2485 __docker_complete_networks 2486 __docker_complete_nodes 2487 __docker_complete_plugins 2488 __docker_complete_services 2489 __docker_complete_volumes && ret=0 2490 fi 2491 ;; 2492 esac 2493 ;; 2494 (login) 2495 _arguments $(__docker_arguments) \ 2496 $opts_help \ 2497 "($help -p --password)"{-p=,--password=}"[Password]:password: " \ 2498 "($help -u --user)"{-u=,--user=}"[Username]:username: " \ 2499 "($help -)1:server: " && ret=0 2500 ;; 2501 (logout) 2502 _arguments $(__docker_arguments) \ 2503 $opts_help \ 2504 "($help -)1:server: " && ret=0 2505 ;; 2506 (network) 2507 local curcontext="$curcontext" state 2508 _arguments $(__docker_arguments) \ 2509 $opts_help \ 2510 "($help -): :->command" \ 2511 "($help -)*:: :->option-or-argument" && ret=0 2512 2513 case $state in 2514 (command) 2515 __docker_network_commands && ret=0 2516 ;; 2517 (option-or-argument) 2518 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2519 __docker_network_subcommand && ret=0 2520 ;; 2521 esac 2522 ;; 2523 (node) 2524 local curcontext="$curcontext" state 2525 _arguments $(__docker_arguments) \ 2526 $opts_help \ 2527 "($help -): :->command" \ 2528 "($help -)*:: :->option-or-argument" && ret=0 2529 2530 case $state in 2531 (command) 2532 __docker_node_commands && ret=0 2533 ;; 2534 (option-or-argument) 2535 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2536 __docker_node_subcommand && ret=0 2537 ;; 2538 esac 2539 ;; 2540 (plugin) 2541 local curcontext="$curcontext" state 2542 _arguments $(__docker_arguments) \ 2543 $opts_help \ 2544 "($help -): :->command" \ 2545 "($help -)*:: :->option-or-argument" && ret=0 2546 2547 case $state in 2548 (command) 2549 __docker_plugin_commands && ret=0 2550 ;; 2551 (option-or-argument) 2552 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2553 __docker_plugin_subcommand && ret=0 2554 ;; 2555 esac 2556 ;; 2557 (ps) 2558 words[1]='ls' 2559 __docker_container_subcommand && ret=0 2560 ;; 2561 (rmi) 2562 words[1]='rm' 2563 __docker_image_subcommand && ret=0 2564 ;; 2565 (search) 2566 _arguments $(__docker_arguments) \ 2567 $opts_help \ 2568 "($help)*"{-f=,--filter=}"[Filter values]:filter:->filter-options" \ 2569 "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ 2570 "($help)--no-trunc[Do not truncate output]" \ 2571 "($help -):term: " && ret=0 2572 2573 case $state in 2574 (filter-options) 2575 __docker_complete_search_filters && ret=0 2576 ;; 2577 esac 2578 ;; 2579 (secret) 2580 local curcontext="$curcontext" state 2581 _arguments $(__docker_arguments) \ 2582 $opts_help \ 2583 "($help -): :->command" \ 2584 "($help -)*:: :->option-or-argument" && ret=0 2585 2586 case $state in 2587 (command) 2588 __docker_secret_commands && ret=0 2589 ;; 2590 (option-or-argument) 2591 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2592 __docker_secret_subcommand && ret=0 2593 ;; 2594 esac 2595 ;; 2596 (service) 2597 local curcontext="$curcontext" state 2598 _arguments $(__docker_arguments) \ 2599 $opts_help \ 2600 "($help -): :->command" \ 2601 "($help -)*:: :->option-or-argument" && ret=0 2602 2603 case $state in 2604 (command) 2605 __docker_service_commands && ret=0 2606 ;; 2607 (option-or-argument) 2608 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2609 __docker_service_subcommand && ret=0 2610 ;; 2611 esac 2612 ;; 2613 (stack) 2614 local curcontext="$curcontext" state 2615 _arguments $(__docker_arguments) \ 2616 $opts_help \ 2617 "($help -): :->command" \ 2618 "($help -)*:: :->option-or-argument" && ret=0 2619 2620 case $state in 2621 (command) 2622 __docker_stack_commands && ret=0 2623 ;; 2624 (option-or-argument) 2625 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2626 __docker_stack_subcommand && ret=0 2627 ;; 2628 esac 2629 ;; 2630 (swarm) 2631 local curcontext="$curcontext" state 2632 _arguments $(__docker_arguments) \ 2633 $opts_help \ 2634 "($help -): :->command" \ 2635 "($help -)*:: :->option-or-argument" && ret=0 2636 2637 case $state in 2638 (command) 2639 __docker_swarm_commands && ret=0 2640 ;; 2641 (option-or-argument) 2642 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2643 __docker_swarm_subcommand && ret=0 2644 ;; 2645 esac 2646 ;; 2647 (system) 2648 local curcontext="$curcontext" state 2649 _arguments $(__docker_arguments) \ 2650 $opts_help \ 2651 "($help -): :->command" \ 2652 "($help -)*:: :->option-or-argument" && ret=0 2653 2654 case $state in 2655 (command) 2656 __docker_system_commands && ret=0 2657 ;; 2658 (option-or-argument) 2659 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2660 __docker_system_subcommand && ret=0 2661 ;; 2662 esac 2663 ;; 2664 (version) 2665 _arguments $(__docker_arguments) \ 2666 $opts_help \ 2667 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 2668 ;; 2669 (volume) 2670 local curcontext="$curcontext" state 2671 _arguments $(__docker_arguments) \ 2672 $opts_help \ 2673 "($help -): :->command" \ 2674 "($help -)*:: :->option-or-argument" && ret=0 2675 2676 case $state in 2677 (command) 2678 __docker_volume_commands && ret=0 2679 ;; 2680 (option-or-argument) 2681 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2682 __docker_volume_subcommand && ret=0 2683 ;; 2684 esac 2685 ;; 2686 (help) 2687 _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 2688 ;; 2689 esac 2690 2691 return ret 2692 } 2693 2694 _docker() { 2695 # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. 2696 # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. 2697 if [[ $service != docker ]]; then 2698 _call_function - _$service 2699 return 2700 fi 2701 2702 local curcontext="$curcontext" state line help="-h --help" 2703 integer ret=1 2704 typeset -A opt_args 2705 2706 _arguments $(__docker_arguments) -C \ 2707 "(: -)"{-h,--help}"[Print usage]" \ 2708 "($help)--config[Location of client config files]:path:_directories" \ 2709 "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ 2710 "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ 2711 "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ 2712 "($help)--tls[Use TLS]" \ 2713 "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ 2714 "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ 2715 "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ 2716 "($help)--tlsverify[Use TLS and verify the remote]" \ 2717 "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ 2718 "($help -v --version)"{-v,--version}"[Print version information and quit]" \ 2719 "($help -): :->command" \ 2720 "($help -)*:: :->option-or-argument" && ret=0 2721 2722 local host=${opt_args[-H]}${opt_args[--host]} 2723 local config=${opt_args[--config]} 2724 local docker_options="${host:+--host $host} ${config:+--config $config}" 2725 2726 case $state in 2727 (command) 2728 __docker_commands && ret=0 2729 ;; 2730 (option-or-argument) 2731 curcontext=${curcontext%:*:*}:docker-$words[1]: 2732 __docker_subcommand && ret=0 2733 ;; 2734 esac 2735 2736 return ret 2737 } 2738 2739 _dockerd() { 2740 integer ret=1 2741 words[1]='daemon' 2742 __docker_subcommand && ret=0 2743 return ret 2744 } 2745 2746 _docker "$@" 2747 2748 # Local Variables: 2749 # mode: Shell-Script 2750 # sh-indentation: 4 2751 # indent-tabs-mode: nil 2752 # sh-basic-offset: 4 2753 # End: 2754 # vim: ft=zsh sw=4 ts=4 et