_docker 121 KB

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