github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/contrib/completion/zsh/_docker (about)

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