github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/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_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_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_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_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=[Container IPv4 address]:IPv4: " 545 "($help)--ip6=[Container 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=[Add a link-local address for the container]: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_networks_ids && ret=0 1037 ;; 1038 (name) 1039 __docker_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 networks=($networks $s) 1086 done 1087 fi 1088 1089 # Names 1090 if [[ $type = (names|all) ]]; then 1091 for line in $lines; do 1092 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1093 s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" 1094 networks=($networks $s) 1095 done 1096 fi 1097 1098 _describe -t networks-list "networks" networks "$@" && ret=0 1099 return ret 1100 } 1101 1102 __docker_networks() { 1103 [[ $PREFIX = -* ]] && return 1 1104 __docker_get_networks all "$@" 1105 } 1106 1107 __docker_networks_ids() { 1108 [[ $PREFIX = -* ]] && return 1 1109 __docker_get_networks ids "$@" 1110 } 1111 1112 __docker_networks_names() { 1113 [[ $PREFIX = -* ]] && return 1 1114 __docker_get_networks names "$@" 1115 } 1116 1117 __docker_network_commands() { 1118 local -a _docker_network_subcommands 1119 _docker_network_subcommands=( 1120 "connect:Connect a container to a network" 1121 "create:Creates a new network with a name specified by the user" 1122 "disconnect:Disconnects a container from a network" 1123 "inspect:Displays detailed information on a network" 1124 "ls:Lists all the networks created by the user" 1125 "prune:Remove all unused networks" 1126 "rm:Deletes one or more networks" 1127 ) 1128 _describe -t docker-network-commands "docker network command" _docker_network_subcommands 1129 } 1130 1131 __docker_network_subcommand() { 1132 local -a _command_args opts_help 1133 local expl help="--help" 1134 integer ret=1 1135 1136 opts_help=("(: -)--help[Print usage]") 1137 1138 case "$words[1]" in 1139 (connect) 1140 _arguments $(__docker_arguments) \ 1141 $opts_help \ 1142 "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ 1143 "($help)--ip=[Container IPv4 address]:IPv4: " \ 1144 "($help)--ip6=[Container IPv6 address]:IPv6: " \ 1145 "($help)*--link=[Add a link to another container]:link:->link" \ 1146 "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ 1147 "($help -)1:network:__docker_networks" \ 1148 "($help -)2:containers:__docker_complete_containers" && ret=0 1149 1150 case $state in 1151 (link) 1152 if compset -P "*:"; then 1153 _wanted alias expl "Alias" compadd -E "" && ret=0 1154 else 1155 __docker_complete_running_containers -qS ":" && ret=0 1156 fi 1157 ;; 1158 esac 1159 ;; 1160 (create) 1161 _arguments $(__docker_arguments) -A '-*' \ 1162 $opts_help \ 1163 "($help)--attachable[Enable manual container attachment]" \ 1164 "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ 1165 "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ 1166 "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ 1167 "($help)--internal[Restricts external access to the network]" \ 1168 "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ 1169 "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ 1170 "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ 1171 "($help)--ipv6[Enable IPv6 networking]" \ 1172 "($help)*--label=[Set metadata on a network]:label=value: " \ 1173 "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ 1174 "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ 1175 "($help -)1:Network Name: " && ret=0 1176 ;; 1177 (disconnect) 1178 _arguments $(__docker_arguments) \ 1179 $opts_help \ 1180 "($help -)1:network:__docker_networks" \ 1181 "($help -)2:containers:__docker_complete_containers" && ret=0 1182 ;; 1183 (inspect) 1184 _arguments $(__docker_arguments) \ 1185 $opts_help \ 1186 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1187 "($help -)*:network:__docker_networks" && ret=0 1188 ;; 1189 (ls) 1190 _arguments $(__docker_arguments) \ 1191 $opts_help \ 1192 "($help)--no-trunc[Do not truncate the output]" \ 1193 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1194 "($help)--format=[Pretty-print networks using a Go template]:template: " \ 1195 "($help -q --quiet)"{-q,--quiet}"[Only display numeric IDs]" && ret=0 1196 case $state in 1197 (filter-options) 1198 __docker_network_complete_ls_filters && ret=0 1199 ;; 1200 esac 1201 ;; 1202 (prune) 1203 _arguments $(__docker_arguments) \ 1204 $opts_help \ 1205 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 1206 ;; 1207 (rm) 1208 _arguments $(__docker_arguments) \ 1209 $opts_help \ 1210 "($help -)*:network:__docker_networks" && ret=0 1211 ;; 1212 (help) 1213 _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 1214 ;; 1215 esac 1216 1217 return ret 1218 } 1219 1220 # EO network 1221 1222 # BO node 1223 1224 __docker_node_complete_ls_filters() { 1225 [[ $PREFIX = -* ]] && return 1 1226 integer ret=1 1227 1228 if compset -P '*='; then 1229 case "${${words[-1]%=*}#*=}" in 1230 (id) 1231 __docker_complete_nodes_ids && ret=0 1232 ;; 1233 (membership) 1234 membership_opts=('accepted' 'pending' 'rejected') 1235 _describe -t membership-opts "membership options" membership_opts && ret=0 1236 ;; 1237 (name) 1238 __docker_complete_nodes_names && ret=0 1239 ;; 1240 (role) 1241 role_opts=('manager' 'worker') 1242 _describe -t role-opts "role options" role_opts && ret=0 1243 ;; 1244 *) 1245 _message 'value' && ret=0 1246 ;; 1247 esac 1248 else 1249 opts=('id' 'label' 'membership' 'name' 'role') 1250 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1251 fi 1252 1253 return ret 1254 } 1255 1256 __docker_node_complete_ps_filters() { 1257 [[ $PREFIX = -* ]] && return 1 1258 integer ret=1 1259 1260 if compset -P '*='; then 1261 case "${${words[-1]%=*}#*=}" in 1262 (desired-state) 1263 state_opts=('accepted' 'running') 1264 _describe -t state-opts "desired state options" state_opts && ret=0 1265 ;; 1266 *) 1267 _message 'value' && ret=0 1268 ;; 1269 esac 1270 else 1271 opts=('desired-state' 'id' 'label' 'name') 1272 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1273 fi 1274 1275 return ret 1276 } 1277 1278 __docker_nodes() { 1279 [[ $PREFIX = -* ]] && return 1 1280 integer ret=1 1281 local line s 1282 declare -a lines nodes args 1283 1284 type=$1; shift 1285 filter=$1; shift 1286 [[ $filter != "none" ]] && args=("-f $filter") 1287 1288 lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) 1289 # Parse header line to find columns 1290 local i=1 j=1 k header=${lines[1]} 1291 declare -A begin end 1292 while (( j < ${#header} - 1 )); do 1293 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1294 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1295 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1296 begin[${header[$i,$((j-1))]}]=$i 1297 end[${header[$i,$((j-1))]}]=$k 1298 done 1299 end[${header[$i,$((j-1))]}]=-1 1300 lines=(${lines[2,-1]}) 1301 1302 # Node ID 1303 if [[ $type = (ids|all) ]]; then 1304 for line in $lines; do 1305 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1306 nodes=($nodes $s) 1307 done 1308 fi 1309 1310 # Names 1311 if [[ $type = (names|all) ]]; then 1312 for line in $lines; do 1313 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1314 nodes=($nodes $s) 1315 done 1316 fi 1317 1318 _describe -t nodes-list "nodes" nodes "$@" && ret=0 1319 return ret 1320 } 1321 1322 __docker_complete_nodes() { 1323 [[ $PREFIX = -* ]] && return 1 1324 __docker_nodes all none "$@" 1325 } 1326 1327 __docker_complete_nodes_ids() { 1328 [[ $PREFIX = -* ]] && return 1 1329 __docker_nodes ids none "$@" 1330 } 1331 1332 __docker_complete_nodes_names() { 1333 [[ $PREFIX = -* ]] && return 1 1334 __docker_nodes names none "$@" 1335 } 1336 1337 __docker_complete_pending_nodes() { 1338 [[ $PREFIX = -* ]] && return 1 1339 __docker_nodes all "membership=pending" "$@" 1340 } 1341 1342 __docker_complete_manager_nodes() { 1343 [[ $PREFIX = -* ]] && return 1 1344 __docker_nodes all "role=manager" "$@" 1345 } 1346 1347 __docker_complete_worker_nodes() { 1348 [[ $PREFIX = -* ]] && return 1 1349 __docker_nodes all "role=worker" "$@" 1350 } 1351 1352 __docker_node_commands() { 1353 local -a _docker_node_subcommands 1354 _docker_node_subcommands=( 1355 "demote:Demote a node as manager in the swarm" 1356 "inspect:Display detailed information on one or more nodes" 1357 "ls:List nodes in the swarm" 1358 "promote:Promote a node as manager in the swarm" 1359 "rm:Remove one or more nodes from the swarm" 1360 "ps:List tasks running on one or more nodes, defaults to current node" 1361 "update:Update a node" 1362 ) 1363 _describe -t docker-node-commands "docker node command" _docker_node_subcommands 1364 } 1365 1366 __docker_node_subcommand() { 1367 local -a _command_args opts_help 1368 local expl help="--help" 1369 integer ret=1 1370 1371 opts_help=("(: -)--help[Print usage]") 1372 1373 case "$words[1]" in 1374 (rm|remove) 1375 _arguments $(__docker_arguments) \ 1376 $opts_help \ 1377 "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ 1378 "($help -)*:node:__docker_complete_pending_nodes" && ret=0 1379 ;; 1380 (demote) 1381 _arguments $(__docker_arguments) \ 1382 $opts_help \ 1383 "($help -)*:node:__docker_complete_manager_nodes" && ret=0 1384 ;; 1385 (inspect) 1386 _arguments $(__docker_arguments) \ 1387 $opts_help \ 1388 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1389 "($help)--pretty[Print the information in a human friendly format]" \ 1390 "($help -)*:node:__docker_complete_nodes" && ret=0 1391 ;; 1392 (ls|list) 1393 _arguments $(__docker_arguments) \ 1394 $opts_help \ 1395 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1396 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1397 case $state in 1398 (filter-options) 1399 __docker_node_complete_ls_filters && ret=0 1400 ;; 1401 esac 1402 ;; 1403 (promote) 1404 _arguments $(__docker_arguments) \ 1405 $opts_help \ 1406 "($help -)*:node:__docker_complete_worker_nodes" && ret=0 1407 ;; 1408 (ps) 1409 _arguments $(__docker_arguments) \ 1410 $opts_help \ 1411 "($help -a --all)"{-a,--all}"[Display all instances]" \ 1412 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1413 "($help)--no-resolve[Do not map IDs to Names]" \ 1414 "($help)--no-trunc[Do not truncate output]" \ 1415 "($help -)*:node:__docker_complete_nodes" && ret=0 1416 case $state in 1417 (filter-options) 1418 __docker_node_complete_ps_filters && ret=0 1419 ;; 1420 esac 1421 ;; 1422 (update) 1423 _arguments $(__docker_arguments) \ 1424 $opts_help \ 1425 "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ 1426 "($help)*--label-add=[Add or update a node label]:key=value: " \ 1427 "($help)*--label-rm=[Remove a node label if exists]:label: " \ 1428 "($help)--role=[Role of the node]:role:(manager worker)" \ 1429 "($help -)1:node:__docker_complete_nodes" && ret=0 1430 ;; 1431 (help) 1432 _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 1433 ;; 1434 esac 1435 1436 return ret 1437 } 1438 1439 # EO node 1440 1441 # BO plugin 1442 1443 __docker_complete_plugins() { 1444 [[ $PREFIX = -* ]] && return 1 1445 integer ret=1 1446 local line s 1447 declare -a lines plugins 1448 1449 lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls)"$'\n'}}) 1450 1451 # Parse header line to find columns 1452 local i=1 j=1 k header=${lines[1]} 1453 declare -A begin end 1454 while (( j < ${#header} - 1 )); do 1455 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1456 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1457 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1458 begin[${header[$i,$((j-1))]}]=$i 1459 end[${header[$i,$((j-1))]}]=$k 1460 done 1461 end[${header[$i,$((j-1))]}]=-1 1462 lines=(${lines[2,-1]}) 1463 1464 # Name 1465 for line in $lines; do 1466 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1467 s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" 1468 plugins=($plugins $s) 1469 done 1470 1471 _describe -t plugins-list "plugins" plugins "$@" && ret=0 1472 return ret 1473 } 1474 1475 __docker_plugin_commands() { 1476 local -a _docker_plugin_subcommands 1477 _docker_plugin_subcommands=( 1478 "disable:Disable a plugin" 1479 "enable:Enable a plugin" 1480 "inspect:Return low-level information about a plugin" 1481 "install:Install a plugin" 1482 "ls:List plugins" 1483 "push:Push a plugin" 1484 "rm:Remove a plugin" 1485 "set:Change settings for a plugin" 1486 ) 1487 _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands 1488 } 1489 1490 __docker_plugin_subcommand() { 1491 local -a _command_args opts_help 1492 local expl help="--help" 1493 integer ret=1 1494 1495 opts_help=("(: -)--help[Print usage]") 1496 1497 case "$words[1]" in 1498 (disable|enable|inspect|install|ls|push|rm) 1499 _arguments $(__docker_arguments) \ 1500 $opts_help \ 1501 "($help -)1:plugin:__docker_complete_plugins" && ret=0 1502 ;; 1503 (set) 1504 _arguments $(__docker_arguments) \ 1505 $opts_help \ 1506 "($help -)1:plugin:__docker_complete_plugins" \ 1507 "($help-)*:key=value: " && ret=0 1508 ;; 1509 (help) 1510 _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 1511 ;; 1512 esac 1513 1514 return ret 1515 } 1516 1517 # EO plugin 1518 1519 # BO secret 1520 1521 __docker_secrets() { 1522 [[ $PREFIX = -* ]] && return 1 1523 integer ret=1 1524 local line s 1525 declare -a lines secrets 1526 1527 type=$1; shift 1528 1529 lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) 1530 1531 # Parse header line to find columns 1532 local i=1 j=1 k header=${lines[1]} 1533 declare -A begin end 1534 while (( j < ${#header} - 1 )); do 1535 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1536 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1537 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1538 begin[${header[$i,$((j-1))]}]=$i 1539 end[${header[$i,$((j-1))]}]=$k 1540 done 1541 end[${header[$i,$((j-1))]}]=-1 1542 lines=(${lines[2,-1]}) 1543 1544 # ID 1545 if [[ $type = (ids|all) ]]; then 1546 for line in $lines; do 1547 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1548 secrets=($secrets $s) 1549 done 1550 fi 1551 1552 # Names 1553 if [[ $type = (names|all) ]]; then 1554 for line in $lines; do 1555 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1556 secrets=($secrets $s) 1557 done 1558 fi 1559 1560 _describe -t secrets-list "secrets" secrets "$@" && ret=0 1561 return ret 1562 } 1563 1564 __docker_complete_secrets() { 1565 [[ $PREFIX = -* ]] && return 1 1566 __docker_secrets all "$@" 1567 } 1568 1569 __docker_secret_commands() { 1570 local -a _docker_secret_subcommands 1571 _docker_secret_subcommands=( 1572 "create:Create a secret using stdin as content" 1573 "inspect:Display detailed information on one or more secrets" 1574 "ls:List secrets" 1575 "rm:Remove one or more secrets" 1576 ) 1577 _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands 1578 } 1579 1580 __docker_secret_subcommand() { 1581 local -a _command_args opts_help 1582 local expl help="--help" 1583 integer ret=1 1584 1585 opts_help=("(: -)--help[Print usage]") 1586 1587 case "$words[1]" in 1588 (create) 1589 _arguments $(__docker_arguments) \ 1590 $opts_help \ 1591 "($help)*"{-l=,--label=}"[Secret labels]:label: " \ 1592 "($help -):secret: " && ret=0 1593 ;; 1594 (inspect) 1595 _arguments $(__docker_arguments) \ 1596 $opts_help \ 1597 "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ 1598 "($help -)*:secret:__docker_complete_secrets" && ret=0 1599 ;; 1600 (ls|list) 1601 _arguments $(__docker_arguments) \ 1602 $opts_help \ 1603 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1604 ;; 1605 (rm|remove) 1606 _arguments $(__docker_arguments) \ 1607 $opts_help \ 1608 "($help -)*:secret:__docker_complete_secrets" && ret=0 1609 ;; 1610 (help) 1611 _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 1612 ;; 1613 esac 1614 1615 return ret 1616 } 1617 1618 # EO secret 1619 1620 # BO service 1621 1622 __docker_service_complete_ls_filters() { 1623 [[ $PREFIX = -* ]] && return 1 1624 integer ret=1 1625 1626 if compset -P '*='; then 1627 case "${${words[-1]%=*}#*=}" in 1628 (id) 1629 __docker_complete_services_ids && ret=0 1630 ;; 1631 (name) 1632 __docker_complete_services_names && ret=0 1633 ;; 1634 *) 1635 _message 'value' && ret=0 1636 ;; 1637 esac 1638 else 1639 opts=('id' 'label' 'name') 1640 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1641 fi 1642 1643 return ret 1644 } 1645 1646 __docker_service_complete_ps_filters() { 1647 [[ $PREFIX = -* ]] && return 1 1648 integer ret=1 1649 1650 if compset -P '*='; then 1651 case "${${words[-1]%=*}#*=}" in 1652 (desired-state) 1653 state_opts=('accepted' 'running') 1654 _describe -t state-opts "desired state options" state_opts && ret=0 1655 ;; 1656 *) 1657 _message 'value' && ret=0 1658 ;; 1659 esac 1660 else 1661 opts=('desired-state' 'id' 'label' 'name') 1662 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1663 fi 1664 1665 return ret 1666 } 1667 1668 __docker_services() { 1669 [[ $PREFIX = -* ]] && return 1 1670 integer ret=1 1671 local line s 1672 declare -a lines services 1673 1674 type=$1; shift 1675 1676 lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) 1677 1678 # Parse header line to find columns 1679 local i=1 j=1 k header=${lines[1]} 1680 declare -A begin end 1681 while (( j < ${#header} - 1 )); do 1682 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1683 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1684 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1685 begin[${header[$i,$((j-1))]}]=$i 1686 end[${header[$i,$((j-1))]}]=$k 1687 done 1688 end[${header[$i,$((j-1))]}]=-1 1689 lines=(${lines[2,-1]}) 1690 1691 # Service ID 1692 if [[ $type = (ids|all) ]]; then 1693 for line in $lines; do 1694 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1695 s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" 1696 services=($services $s) 1697 done 1698 fi 1699 1700 # Names 1701 if [[ $type = (names|all) ]]; then 1702 for line in $lines; do 1703 s="${line[${begin[NAME]},${end[NAME]}]%% ##}" 1704 s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" 1705 services=($services $s) 1706 done 1707 fi 1708 1709 _describe -t services-list "services" services "$@" && ret=0 1710 return ret 1711 } 1712 1713 __docker_complete_services() { 1714 [[ $PREFIX = -* ]] && return 1 1715 __docker_services all "$@" 1716 } 1717 1718 __docker_complete_services_ids() { 1719 [[ $PREFIX = -* ]] && return 1 1720 __docker_services ids "$@" 1721 } 1722 1723 __docker_complete_services_names() { 1724 [[ $PREFIX = -* ]] && return 1 1725 __docker_services names "$@" 1726 } 1727 1728 __docker_service_commands() { 1729 local -a _docker_service_subcommands 1730 _docker_service_subcommands=( 1731 "create:Create a new service" 1732 "inspect:Display detailed information on one or more services" 1733 "ls:List services" 1734 "rm:Remove one or more services" 1735 "scale:Scale one or multiple replicated services" 1736 "ps:List the tasks of a service" 1737 "update:Update a service" 1738 ) 1739 _describe -t docker-service-commands "docker service command" _docker_service_subcommands 1740 } 1741 1742 __docker_service_subcommand() { 1743 local -a _command_args opts_help opts_create_update 1744 local expl help="--help" 1745 integer ret=1 1746 1747 opts_help=("(: -)--help[Print usage]") 1748 opts_create_update=( 1749 "($help)*--constraint=[Placement constraints]:constraint: " 1750 "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" 1751 "($help)*"{-e=,--env=}"[Set environment variables]:env: " 1752 "($help)--health-cmd=[Command to run to check health]:command: " 1753 "($help)--health-interval=[Time between running the check]:time: " 1754 "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" 1755 "($help)--health-timeout=[Maximum time to allow one check to run]:time: " 1756 "($help)--hostname=[Service container hostname]:hostname: " \ 1757 "($help)*--label=[Service labels]:label: " 1758 "($help)--limit-cpu=[Limit CPUs]:value: " 1759 "($help)--limit-memory=[Limit Memory]:value: " 1760 "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" 1761 "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" 1762 "($help)*--mount=[Attach a filesystem mount to the service]:mount: " 1763 "($help)*--network=[Network attachments]:network: " 1764 "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" 1765 "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " 1766 "($help)--replicas=[Number of tasks]:replicas: " 1767 "($help)--reserve-cpu=[Reserve CPUs]:value: " 1768 "($help)--reserve-memory=[Reserve Memory]:value: " 1769 "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" 1770 "($help)--restart-delay=[Delay between restart attempts]:delay: " 1771 "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " 1772 "($help)--restart-window=[Window used to evaluate the restart policy]:window: " 1773 "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" 1774 "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " 1775 "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" 1776 "($help)--update-delay=[Delay between updates]:delay: " 1777 "($help)--update-failure-action=[Action on update failure]:mode:(pause continue)" 1778 "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " 1779 "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " 1780 "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " 1781 "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" 1782 "($help)--with-registry-auth[Send registry authentication details to swarm agents]" 1783 "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" 1784 ) 1785 1786 case "$words[1]" in 1787 (create) 1788 _arguments $(__docker_arguments) \ 1789 $opts_help \ 1790 $opts_create_update \ 1791 "($help)*--container-label=[Container labels]:label: " \ 1792 "($help)*--dns=[Set custom DNS servers]:DNS: " \ 1793 "($help)*--dns-option=[Set DNS options]:DNS option: " \ 1794 "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ 1795 "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ 1796 "($help)--mode=[Service Mode]:mode:(global replicated)" \ 1797 "($help)--name=[Service name]:name: " \ 1798 "($help)*--port=[Publish a port]:port: " \ 1799 "($help -): :__docker_complete_images" \ 1800 "($help -):command: _command_names -e" \ 1801 "($help -)*::arguments: _normal" && ret=0 1802 ;; 1803 (inspect) 1804 _arguments $(__docker_arguments) \ 1805 $opts_help \ 1806 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 1807 "($help)--pretty[Print the information in a human friendly format]" \ 1808 "($help -)*:service:__docker_complete_services" && ret=0 1809 ;; 1810 (ls|list) 1811 _arguments $(__docker_arguments) \ 1812 $opts_help \ 1813 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:->filter-options" \ 1814 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 1815 case $state in 1816 (filter-options) 1817 __docker_service_complete_ls_filters && ret=0 1818 ;; 1819 esac 1820 ;; 1821 (rm|remove) 1822 _arguments $(__docker_arguments) \ 1823 $opts_help \ 1824 "($help -)*:service:__docker_complete_services" && ret=0 1825 ;; 1826 (scale) 1827 _arguments $(__docker_arguments) \ 1828 $opts_help \ 1829 "($help -)*:service:->values" && ret=0 1830 case $state in 1831 (values) 1832 if compset -P '*='; then 1833 _message 'replicas' && ret=0 1834 else 1835 __docker_complete_services -qS "=" 1836 fi 1837 ;; 1838 esac 1839 ;; 1840 (ps) 1841 _arguments $(__docker_arguments) \ 1842 $opts_help \ 1843 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 1844 "($help)--no-resolve[Do not map IDs to Names]" \ 1845 "($help)--no-trunc[Do not truncate output]" \ 1846 "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ 1847 "($help -)1:service:__docker_complete_services" && ret=0 1848 case $state in 1849 (filter-options) 1850 __docker_service_complete_ps_filters && ret=0 1851 ;; 1852 esac 1853 ;; 1854 (update) 1855 _arguments $(__docker_arguments) \ 1856 $opts_help \ 1857 $opts_create_update \ 1858 "($help)--arg=[Service command args]:arguments: _normal" \ 1859 "($help)*--container-label-add=[Add or update container labels]:label: " \ 1860 "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ 1861 "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ 1862 "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ 1863 "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ 1864 "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ 1865 "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ 1866 "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ 1867 "($help)--force[Force update]" \ 1868 "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ 1869 "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ 1870 "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ 1871 "($help)*--port-add=[Add or update a port]:port: " \ 1872 "($help)*--port-rm=[Remove a port(target-port mandatory)]:port: " \ 1873 "($help)--rollback[Rollback to previous specification]" \ 1874 "($help -)1:service:__docker_complete_services" && ret=0 1875 ;; 1876 (help) 1877 _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 1878 ;; 1879 esac 1880 1881 return ret 1882 } 1883 1884 # EO service 1885 1886 # BO stack 1887 1888 __docker_stack_complete_ps_filters() { 1889 [[ $PREFIX = -* ]] && return 1 1890 integer ret=1 1891 1892 if compset -P '*='; then 1893 case "${${words[-1]%=*}#*=}" in 1894 (desired-state) 1895 state_opts=('accepted' 'running') 1896 _describe -t state-opts "desired state options" state_opts && ret=0 1897 ;; 1898 *) 1899 _message 'value' && ret=0 1900 ;; 1901 esac 1902 else 1903 opts=('desired-state' 'id' 'name') 1904 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1905 fi 1906 1907 return ret 1908 } 1909 1910 __docker_stack_complete_services_filters() { 1911 [[ $PREFIX = -* ]] && return 1 1912 integer ret=1 1913 1914 if compset -P '*='; then 1915 case "${${words[-1]%=*}#*=}" in 1916 *) 1917 _message 'value' && ret=0 1918 ;; 1919 esac 1920 else 1921 opts=('id' 'label' 'name') 1922 _describe -t filter-opts "filter options" opts -qS "=" && ret=0 1923 fi 1924 1925 return ret 1926 } 1927 1928 __docker_stacks() { 1929 [[ $PREFIX = -* ]] && return 1 1930 integer ret=1 1931 local line s 1932 declare -a lines stacks 1933 1934 lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) 1935 1936 # Parse header line to find columns 1937 local i=1 j=1 k header=${lines[1]} 1938 declare -A begin end 1939 while (( j < ${#header} - 1 )); do 1940 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 1941 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 1942 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 1943 begin[${header[$i,$((j-1))]}]=$i 1944 end[${header[$i,$((j-1))]}]=$k 1945 done 1946 end[${header[$i,$((j-1))]}]=-1 1947 lines=(${lines[2,-1]}) 1948 1949 # Service ID 1950 for line in $lines; do 1951 s="${line[${begin[ID]},${end[ID]}]%% ##}" 1952 stacks=($stacks $s) 1953 done 1954 1955 _describe -t stacks-list "stacks" stacks "$@" && ret=0 1956 return ret 1957 } 1958 1959 __docker_complete_stacks() { 1960 [[ $PREFIX = -* ]] && return 1 1961 __docker_stacks "$@" 1962 } 1963 1964 __docker_stack_commands() { 1965 local -a _docker_stack_subcommands 1966 _docker_stack_subcommands=( 1967 "deploy:Deploy a new stack or update an existing stack" 1968 "ls:List stacks" 1969 "ps:List the tasks in the stack" 1970 "rm:Remove the stack" 1971 "services:List the services in the stack" 1972 ) 1973 _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands 1974 } 1975 1976 __docker_stack_subcommand() { 1977 local -a _command_args opts_help 1978 local expl help="--help" 1979 integer ret=1 1980 1981 opts_help=("(: -)--help[Print usage]") 1982 1983 case "$words[1]" in 1984 (deploy|up) 1985 _arguments $(__docker_arguments) \ 1986 $opts_help \ 1987 "($help)--bundle-file=[Path to a Distributed Application Bundle file]:dab:_files -g \"*.dab\"" \ 1988 "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file]:compose file:_files -g \"*.(yml|yaml)\"" \ 1989 "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ 1990 "($help -):stack:__docker_complete_stacks" && ret=0 1991 ;; 1992 (ls|list) 1993 _arguments $(__docker_arguments) \ 1994 $opts_help && ret=0 1995 ;; 1996 (ps) 1997 _arguments $(__docker_arguments) \ 1998 $opts_help \ 1999 "($help -a --all)"{-a,--all}"[Display all tasks]" \ 2000 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ 2001 "($help)--no-resolve[Do not map IDs to Names]" \ 2002 "($help)--no-trunc[Do not truncate output]" \ 2003 "($help -):stack:__docker_complete_stacks" && ret=0 2004 ;; 2005 (rm|remove|down) 2006 _arguments $(__docker_arguments) \ 2007 $opts_help \ 2008 "($help -):stack:__docker_complete_stacks" && ret=0 2009 ;; 2010 (services) 2011 _arguments $(__docker_arguments) \ 2012 $opts_help \ 2013 "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ 2014 "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ 2015 "($help -):stack:__docker_complete_stacks" && ret=0 2016 ;; 2017 (help) 2018 _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 2019 ;; 2020 esac 2021 2022 return ret 2023 } 2024 2025 # EO stack 2026 2027 # BO swarm 2028 2029 __docker_swarm_commands() { 2030 local -a _docker_swarm_subcommands 2031 _docker_swarm_subcommands=( 2032 "init:Initialize a swarm" 2033 "join:Join a swarm as a node and/or manager" 2034 "join-token:Manage join tokens" 2035 "leave:Leave a swarm" 2036 "update:Update the swarm" 2037 ) 2038 _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands 2039 } 2040 2041 __docker_swarm_subcommand() { 2042 local -a _command_args opts_help 2043 local expl help="--help" 2044 integer ret=1 2045 2046 opts_help=("(: -)--help[Print usage]") 2047 2048 case "$words[1]" in 2049 (init) 2050 _arguments $(__docker_arguments) \ 2051 $opts_help \ 2052 "($help)--advertise-addr[Advertised address]:ip\:port: " \ 2053 "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ 2054 "($help)--force-new-cluster[Force create a new cluster from current state]" \ 2055 "($help)--listen-addr=[Listen address]:ip\:port: " \ 2056 "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ 2057 "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ 2058 "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 2059 ;; 2060 (join) 2061 _arguments $(__docker_arguments) \ 2062 $opts_help \ 2063 "($help)--advertise-addr[Advertised address]:ip\:port: " \ 2064 "($help)--listen-addr=[Listen address]:ip\:port: " \ 2065 "($help)--token=[Token for entry into the swarm]:secret: " \ 2066 "($help -):host\:port: " && ret=0 2067 ;; 2068 (join-token) 2069 _arguments $(__docker_arguments) \ 2070 $opts_help \ 2071 "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ 2072 "($help)--rotate[Rotate join token]" \ 2073 "($help -):role:(manager worker)" && ret=0 2074 ;; 2075 (leave) 2076 _arguments $(__docker_arguments) \ 2077 $opts_help \ 2078 "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 2079 ;; 2080 (update) 2081 _arguments $(__docker_arguments) \ 2082 $opts_help \ 2083 "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ 2084 "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ 2085 "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ 2086 "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ 2087 "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ 2088 "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 2089 ;; 2090 (help) 2091 _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 2092 ;; 2093 esac 2094 2095 return ret 2096 } 2097 2098 # EO swarm 2099 2100 # BO system 2101 2102 __docker_system_commands() { 2103 local -a _docker_system_subcommands 2104 _docker_system_subcommands=( 2105 "df:Show docker filesystem usage" 2106 "events:Get real time events from the server" 2107 "info:Display system-wide information" 2108 "prune:Remove unused data" 2109 ) 2110 _describe -t docker-system-commands "docker system command" _docker_system_subcommands 2111 } 2112 2113 __docker_system_subcommand() { 2114 local -a _command_args opts_help 2115 local expl help="--help" 2116 integer ret=1 2117 2118 opts_help=("(: -)--help[Print usage]") 2119 2120 case "$words[1]" in 2121 (df) 2122 _arguments $(__docker_arguments) \ 2123 $opts_help \ 2124 "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 2125 ;; 2126 (events) 2127 _arguments $(__docker_arguments) \ 2128 $opts_help \ 2129 "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ 2130 "($help)--since=[Events created since this timestamp]:timestamp: " \ 2131 "($help)--until=[Events created until this timestamp]:timestamp: " \ 2132 "($help)--format=[Format the output using the given go template]:template: " && ret=0 2133 ;; 2134 (info) 2135 _arguments $(__docker_arguments) \ 2136 $opts_help \ 2137 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 2138 ;; 2139 (prune) 2140 _arguments $(__docker_arguments) \ 2141 $opts_help \ 2142 "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ 2143 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 2144 ;; 2145 (help) 2146 _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 2147 ;; 2148 esac 2149 2150 return ret 2151 } 2152 2153 # EO system 2154 2155 # BO volume 2156 2157 __docker_volume_complete_ls_filters() { 2158 [[ $PREFIX = -* ]] && return 1 2159 integer ret=1 2160 2161 if compset -P '*='; then 2162 case "${${words[-1]%=*}#*=}" in 2163 (dangling) 2164 dangling_opts=('true' 'false') 2165 _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 2166 ;; 2167 (driver) 2168 __docker_complete_info_plugins Volume && ret=0 2169 ;; 2170 (name) 2171 __docker_volumes && ret=0 2172 ;; 2173 *) 2174 _message 'value' && ret=0 2175 ;; 2176 esac 2177 else 2178 opts=('dangling' 'driver' 'label' 'name') 2179 _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 2180 fi 2181 2182 return ret 2183 } 2184 2185 __docker_volumes() { 2186 [[ $PREFIX = -* ]] && return 1 2187 integer ret=1 2188 declare -a lines volumes 2189 2190 lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) 2191 2192 # Parse header line to find columns 2193 local i=1 j=1 k header=${lines[1]} 2194 declare -A begin end 2195 while (( j < ${#header} - 1 )); do 2196 i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) 2197 j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) 2198 k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) 2199 begin[${header[$i,$((j-1))]}]=$i 2200 end[${header[$i,$((j-1))]}]=$k 2201 done 2202 end[${header[$i,$((j-1))]}]=-1 2203 lines=(${lines[2,-1]}) 2204 2205 # Names 2206 local line s 2207 for line in $lines; do 2208 s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" 2209 s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" 2210 volumes=($volumes $s) 2211 done 2212 2213 _describe -t volumes-list "volumes" volumes && ret=0 2214 return ret 2215 } 2216 2217 __docker_volume_commands() { 2218 local -a _docker_volume_subcommands 2219 _docker_volume_subcommands=( 2220 "create:Create a volume" 2221 "inspect:Display detailed information on one or more volumes" 2222 "ls:List volumes" 2223 "prune:Remove all unused volumes" 2224 "rm:Remove one or more volumes" 2225 ) 2226 _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands 2227 } 2228 2229 __docker_volume_subcommand() { 2230 local -a _command_args opts_help 2231 local expl help="--help" 2232 integer ret=1 2233 2234 opts_help=("(: -)--help[Print usage]") 2235 2236 case "$words[1]" in 2237 (create) 2238 _arguments $(__docker_arguments) -A '-*' \ 2239 $opts_help \ 2240 "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ 2241 "($help)*--label=[Set metadata for a volume]:label=value: " \ 2242 "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ 2243 "($help -)1:Volume name: " && ret=0 2244 ;; 2245 (inspect) 2246 _arguments $(__docker_arguments) \ 2247 $opts_help \ 2248 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 2249 "($help -)1:volume:__docker_volumes" && ret=0 2250 ;; 2251 (ls) 2252 _arguments $(__docker_arguments) \ 2253 $opts_help \ 2254 "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ 2255 "($help)--format=[Pretty-print volumes using a Go template]:template: " \ 2256 "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 2257 case $state in 2258 (filter-options) 2259 __docker_volume_complete_ls_filters && ret=0 2260 ;; 2261 esac 2262 ;; 2263 (prune) 2264 _arguments $(__docker_arguments) \ 2265 $opts_help \ 2266 "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 2267 ;; 2268 (rm) 2269 _arguments $(__docker_arguments) \ 2270 $opts_help \ 2271 "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ 2272 "($help -):volume:__docker_volumes" && ret=0 2273 ;; 2274 (help) 2275 _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 2276 ;; 2277 esac 2278 2279 return ret 2280 } 2281 2282 # EO volume 2283 2284 __docker_caching_policy() { 2285 oldp=( "$1"(Nmh+1) ) # 1 hour 2286 (( $#oldp )) 2287 } 2288 2289 __docker_commands() { 2290 local cache_policy 2291 2292 zstyle -s ":completion:${curcontext}:" cache-policy cache_policy 2293 if [[ -z "$cache_policy" ]]; then 2294 zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy 2295 fi 2296 2297 if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands) \ 2298 && ! _retrieve_cache docker_subcommands; 2299 then 2300 local -a lines 2301 lines=(${(f)"$(_call_program commands docker 2>&1)"}) 2302 _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/ ##/:}) 2303 _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command') 2304 (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands 2305 fi 2306 _describe -t docker-commands "docker command" _docker_subcommands 2307 } 2308 2309 __docker_subcommand() { 2310 local -a _command_args opts_help 2311 local expl help="--help" 2312 integer ret=1 2313 2314 opts_help=("(: -)--help[Print usage]") 2315 2316 case "$words[1]" in 2317 (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) 2318 __docker_container_subcommand && ret=0 2319 ;; 2320 (build|history|import|load|pull|push|save|tag) 2321 __docker_image_subcommand && ret=0 2322 ;; 2323 (container) 2324 local curcontext="$curcontext" state 2325 _arguments $(__docker_arguments) \ 2326 $opts_help \ 2327 "($help -): :->command" \ 2328 "($help -)*:: :->option-or-argument" && ret=0 2329 2330 case $state in 2331 (command) 2332 __docker_container_commands && ret=0 2333 ;; 2334 (option-or-argument) 2335 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2336 __docker_container_subcommand && ret=0 2337 ;; 2338 esac 2339 ;; 2340 (daemon) 2341 _arguments $(__docker_arguments) \ 2342 $opts_help \ 2343 "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ 2344 "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ 2345 "($help)*--authorization-plugin=[Authorization plugins to load]" \ 2346 "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ 2347 "($help)--bip=[Network bridge IP]:IP address: " \ 2348 "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ 2349 "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \ 2350 "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \ 2351 "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \ 2352 "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ 2353 "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ 2354 "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ 2355 "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ 2356 "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ 2357 "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ 2358 "($help)--disable-legacy-registry[Disable contacting legacy registries]" \ 2359 "($help)*--dns=[DNS server to use]:DNS: " \ 2360 "($help)*--dns-opt=[DNS options to use]:DNS option: " \ 2361 "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ 2362 "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ 2363 "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ 2364 "($help)--experimental[Enable experimental features]" \ 2365 "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ 2366 "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ 2367 "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ 2368 "($help -g --graph)"{-g=,--graph=}"[Root of the Docker runtime]:path:_directories" \ 2369 "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ 2370 "($help)--icc[Enable inter-container communication]" \ 2371 "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ 2372 "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ 2373 "($help)--ip=[Default IP when binding container ports]" \ 2374 "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ 2375 "($help)--ip-masq[Enable IP masquerading]" \ 2376 "($help)--iptables[Enable addition of iptables rules]" \ 2377 "($help)--ipv6[Enable IPv6 networking]" \ 2378 "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ 2379 "($help)*--label=[Key=value labels]:label: " \ 2380 "($help)--live-restore[Enable live restore of docker when containers are still running]" \ 2381 "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ 2382 "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ 2383 "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \ 2384 "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \ 2385 "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ 2386 "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ 2387 "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ 2388 "($help)--raw-logs[Full timestamps without ANSI coloring]" \ 2389 "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \ 2390 "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ 2391 "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \ 2392 "($help)--selinux-enabled[Enable selinux support]" \ 2393 "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ 2394 "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ 2395 "($help)--tls[Use TLS]" \ 2396 "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ 2397 "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ 2398 "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ 2399 "($help)--tlsverify[Use TLS and verify the remote]" \ 2400 "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \ 2401 "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ 2402 "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" && ret=0 2403 2404 case $state in 2405 (cluster-store) 2406 if compset -P '*://'; then 2407 _message 'host:port' && ret=0 2408 else 2409 store=('consul' 'etcd' 'zk') 2410 _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0 2411 fi 2412 ;; 2413 (cluster-store-options) 2414 if compset -P '*='; then 2415 _files && ret=0 2416 else 2417 opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path') 2418 _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0 2419 fi 2420 ;; 2421 (users-groups) 2422 if compset -P '*:'; then 2423 _groups && ret=0 2424 else 2425 _describe -t userns-default "default Docker user management" '(default)' && ret=0 2426 _users && ret=0 2427 fi 2428 ;; 2429 esac 2430 ;; 2431 (events|info) 2432 __docker_system_subcommand && ret=0 2433 ;; 2434 (image) 2435 local curcontext="$curcontext" state 2436 _arguments $(__docker_arguments) \ 2437 $opts_help \ 2438 "($help -): :->command" \ 2439 "($help -)*:: :->option-or-argument" && ret=0 2440 2441 case $state in 2442 (command) 2443 __docker_image_commands && ret=0 2444 ;; 2445 (option-or-argument) 2446 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2447 __docker_image_subcommand && ret=0 2448 ;; 2449 esac 2450 ;; 2451 (images) 2452 words[1]='ls' 2453 __docker_image_subcommand && ret=0 2454 ;; 2455 (inspect) 2456 local state 2457 _arguments $(__docker_arguments) \ 2458 $opts_help \ 2459 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ 2460 "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ 2461 "($help)--type=[Return JSON for specified type]:type:(image container)" \ 2462 "($help -)*: :->values" && ret=0 2463 2464 case $state in 2465 (values) 2466 if [[ ${words[(r)--type=container]} == --type=container ]]; then 2467 __docker_complete_containers && ret=0 2468 elif [[ ${words[(r)--type=image]} == --type=image ]]; then 2469 __docker_complete_images && ret=0 2470 else 2471 __docker_complete_images && __docker_complete_containers && ret=0 2472 fi 2473 ;; 2474 esac 2475 ;; 2476 (login) 2477 _arguments $(__docker_arguments) \ 2478 $opts_help \ 2479 "($help -p --password)"{-p=,--password=}"[Password]:password: " \ 2480 "($help -u --user)"{-u=,--user=}"[Username]:username: " \ 2481 "($help -)1:server: " && ret=0 2482 ;; 2483 (logout) 2484 _arguments $(__docker_arguments) \ 2485 $opts_help \ 2486 "($help -)1:server: " && ret=0 2487 ;; 2488 (network) 2489 local curcontext="$curcontext" state 2490 _arguments $(__docker_arguments) \ 2491 $opts_help \ 2492 "($help -): :->command" \ 2493 "($help -)*:: :->option-or-argument" && ret=0 2494 2495 case $state in 2496 (command) 2497 __docker_network_commands && ret=0 2498 ;; 2499 (option-or-argument) 2500 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2501 __docker_network_subcommand && ret=0 2502 ;; 2503 esac 2504 ;; 2505 (node) 2506 local curcontext="$curcontext" state 2507 _arguments $(__docker_arguments) \ 2508 $opts_help \ 2509 "($help -): :->command" \ 2510 "($help -)*:: :->option-or-argument" && ret=0 2511 2512 case $state in 2513 (command) 2514 __docker_node_commands && ret=0 2515 ;; 2516 (option-or-argument) 2517 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2518 __docker_node_subcommand && ret=0 2519 ;; 2520 esac 2521 ;; 2522 (plugin) 2523 local curcontext="$curcontext" state 2524 _arguments $(__docker_arguments) \ 2525 $opts_help \ 2526 "($help -): :->command" \ 2527 "($help -)*:: :->option-or-argument" && ret=0 2528 2529 case $state in 2530 (command) 2531 __docker_plugin_commands && ret=0 2532 ;; 2533 (option-or-argument) 2534 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2535 __docker_plugin_subcommand && ret=0 2536 ;; 2537 esac 2538 ;; 2539 (ps) 2540 words[1]='ls' 2541 __docker_container_subcommand && ret=0 2542 ;; 2543 (rmi) 2544 words[1]='rm' 2545 __docker_image_subcommand && ret=0 2546 ;; 2547 (search) 2548 _arguments $(__docker_arguments) \ 2549 $opts_help \ 2550 "($help)*"{-f=,--filter=}"[Filter values]:filter:->filter-options" \ 2551 "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ 2552 "($help)--no-trunc[Do not truncate output]" \ 2553 "($help -):term: " && ret=0 2554 2555 case $state in 2556 (filter-options) 2557 __docker_complete_search_filters && ret=0 2558 ;; 2559 esac 2560 ;; 2561 (secret) 2562 local curcontext="$curcontext" state 2563 _arguments $(__docker_arguments) \ 2564 $opts_help \ 2565 "($help -): :->command" \ 2566 "($help -)*:: :->option-or-argument" && ret=0 2567 2568 case $state in 2569 (command) 2570 __docker_secret_commands && ret=0 2571 ;; 2572 (option-or-argument) 2573 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2574 __docker_secret_subcommand && ret=0 2575 ;; 2576 esac 2577 ;; 2578 (service) 2579 local curcontext="$curcontext" state 2580 _arguments $(__docker_arguments) \ 2581 $opts_help \ 2582 "($help -): :->command" \ 2583 "($help -)*:: :->option-or-argument" && ret=0 2584 2585 case $state in 2586 (command) 2587 __docker_service_commands && ret=0 2588 ;; 2589 (option-or-argument) 2590 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2591 __docker_service_subcommand && ret=0 2592 ;; 2593 esac 2594 ;; 2595 (stack) 2596 local curcontext="$curcontext" state 2597 _arguments $(__docker_arguments) \ 2598 $opts_help \ 2599 "($help -): :->command" \ 2600 "($help -)*:: :->option-or-argument" && ret=0 2601 2602 case $state in 2603 (command) 2604 __docker_stack_commands && ret=0 2605 ;; 2606 (option-or-argument) 2607 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2608 __docker_stack_subcommand && ret=0 2609 ;; 2610 esac 2611 ;; 2612 (swarm) 2613 local curcontext="$curcontext" state 2614 _arguments $(__docker_arguments) \ 2615 $opts_help \ 2616 "($help -): :->command" \ 2617 "($help -)*:: :->option-or-argument" && ret=0 2618 2619 case $state in 2620 (command) 2621 __docker_swarm_commands && ret=0 2622 ;; 2623 (option-or-argument) 2624 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2625 __docker_swarm_subcommand && ret=0 2626 ;; 2627 esac 2628 ;; 2629 (system) 2630 local curcontext="$curcontext" state 2631 _arguments $(__docker_arguments) \ 2632 $opts_help \ 2633 "($help -): :->command" \ 2634 "($help -)*:: :->option-or-argument" && ret=0 2635 2636 case $state in 2637 (command) 2638 __docker_system_commands && ret=0 2639 ;; 2640 (option-or-argument) 2641 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2642 __docker_system_subcommand && ret=0 2643 ;; 2644 esac 2645 ;; 2646 (version) 2647 _arguments $(__docker_arguments) \ 2648 $opts_help \ 2649 "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 2650 ;; 2651 (volume) 2652 local curcontext="$curcontext" state 2653 _arguments $(__docker_arguments) \ 2654 $opts_help \ 2655 "($help -): :->command" \ 2656 "($help -)*:: :->option-or-argument" && ret=0 2657 2658 case $state in 2659 (command) 2660 __docker_volume_commands && ret=0 2661 ;; 2662 (option-or-argument) 2663 curcontext=${curcontext%:*:*}:docker-${words[-1]}: 2664 __docker_volume_subcommand && ret=0 2665 ;; 2666 esac 2667 ;; 2668 (help) 2669 _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 2670 ;; 2671 esac 2672 2673 return ret 2674 } 2675 2676 _docker() { 2677 # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. 2678 # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. 2679 if [[ $service != docker ]]; then 2680 _call_function - _$service 2681 return 2682 fi 2683 2684 local curcontext="$curcontext" state line help="-h --help" 2685 integer ret=1 2686 typeset -A opt_args 2687 2688 _arguments $(__docker_arguments) -C \ 2689 "(: -)"{-h,--help}"[Print usage]" \ 2690 "($help)--config[Location of client config files]:path:_directories" \ 2691 "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ 2692 "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ 2693 "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ 2694 "($help)--tls[Use TLS]" \ 2695 "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ 2696 "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ 2697 "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ 2698 "($help)--tlsverify[Use TLS and verify the remote]" \ 2699 "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ 2700 "($help -v --version)"{-v,--version}"[Print version information and quit]" \ 2701 "($help -): :->command" \ 2702 "($help -)*:: :->option-or-argument" && ret=0 2703 2704 local host=${opt_args[-H]}${opt_args[--host]} 2705 local config=${opt_args[--config]} 2706 local docker_options="${host:+--host $host} ${config:+--config $config}" 2707 2708 case $state in 2709 (command) 2710 __docker_commands && ret=0 2711 ;; 2712 (option-or-argument) 2713 curcontext=${curcontext%:*:*}:docker-$words[1]: 2714 __docker_subcommand && ret=0 2715 ;; 2716 esac 2717 2718 return ret 2719 } 2720 2721 _dockerd() { 2722 integer ret=1 2723 words[1]='daemon' 2724 __docker_subcommand && ret=0 2725 return ret 2726 } 2727 2728 _docker "$@" 2729 2730 # Local Variables: 2731 # mode: Shell-Script 2732 # sh-indentation: 4 2733 # indent-tabs-mode: nil 2734 # sh-basic-offset: 4 2735 # End: 2736 # vim: ft=zsh sw=4 ts=4 et