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