docker 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682
  1. #!/bin/bash
  2. #
  3. # bash completion file for core docker commands
  4. #
  5. # This script provides completion of:
  6. # - commands and their options
  7. # - container ids and names
  8. # - image repos and tags
  9. # - filepaths
  10. #
  11. # To enable the completions either:
  12. # - place this file in /etc/bash_completion.d
  13. # or
  14. # - copy this file to e.g. ~/.docker-completion.sh and add the line
  15. # below to your .bashrc after bash completion features are loaded
  16. # . ~/.docker-completion.sh
  17. #
  18. # Configuration:
  19. #
  20. # You can tailor completion for the "events", "history", "inspect", "run",
  21. # "rmi" and "save" commands by settings the following environment
  22. # variables:
  23. #
  24. # DOCKER_COMPLETION_SHOW_IMAGE_IDS
  25. # "none" - Show names only (default)
  26. # "non-intermediate" - Show names and ids, but omit intermediate image IDs
  27. # "all" - Show names and ids, including intermediate image IDs
  28. #
  29. # DOCKER_COMPLETION_SHOW_TAGS
  30. # "yes" - include tags in completion options (default)
  31. # "no" - don't include tags in completion options
  32. #
  33. # Note:
  34. # Currently, the completions will not work if the docker daemon is not
  35. # bound to the default communication port/socket
  36. # If the docker daemon is using a unix socket for communication your user
  37. # must have access to the socket for the completions to function correctly
  38. #
  39. # Note for developers:
  40. # Please arrange options sorted alphabetically by long name with the short
  41. # options immediately following their corresponding long form.
  42. # This order should be applied to lists, alternatives and code blocks.
  43. __docker_q() {
  44. docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@"
  45. }
  46. __docker_containers_all() {
  47. local IFS=$'\n'
  48. local containers=( $(__docker_q ps -aq --no-trunc) )
  49. if [ "$1" ]; then
  50. containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
  51. fi
  52. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  53. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  54. unset IFS
  55. COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
  56. }
  57. __docker_containers_running() {
  58. __docker_containers_all '.State.Running'
  59. }
  60. __docker_containers_stopped() {
  61. __docker_containers_all 'not .State.Running'
  62. }
  63. __docker_containers_pauseable() {
  64. __docker_containers_all 'and .State.Running (not .State.Paused)'
  65. }
  66. __docker_containers_unpauseable() {
  67. __docker_containers_all '.State.Paused'
  68. }
  69. __docker_container_names() {
  70. local containers=( $(__docker_q ps -aq --no-trunc) )
  71. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  72. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  73. COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
  74. }
  75. __docker_container_ids() {
  76. local containers=( $(__docker_q ps -aq) )
  77. COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
  78. }
  79. __docker_images() {
  80. local images_args=""
  81. case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
  82. all)
  83. images_args="--no-trunc -a"
  84. ;;
  85. non-intermediate)
  86. images_args="--no-trunc"
  87. ;;
  88. esac
  89. local repo_print_command
  90. if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
  91. repo_print_command='print $1; print $1":"$2'
  92. else
  93. repo_print_command='print $1'
  94. fi
  95. local awk_script
  96. case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
  97. all|non-intermediate)
  98. awk_script='NR>1 { print $3; if ($1 != "<none>") { '"$repo_print_command"' } }'
  99. ;;
  100. none|*)
  101. awk_script='NR>1 && $1 != "<none>" { '"$repo_print_command"' }'
  102. ;;
  103. esac
  104. local images=$(__docker_q images $images_args | awk "$awk_script")
  105. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  106. __ltrim_colon_completions "$cur"
  107. }
  108. __docker_image_repos() {
  109. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  110. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  111. }
  112. __docker_image_repos_and_tags() {
  113. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  114. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  115. __ltrim_colon_completions "$cur"
  116. }
  117. __docker_containers_and_images() {
  118. __docker_containers_all
  119. local containers=( "${COMPREPLY[@]}" )
  120. __docker_images
  121. COMPREPLY+=( "${containers[@]}" )
  122. }
  123. __docker_volumes() {
  124. COMPREPLY=( $(compgen -W "$(__docker_q volume ls -q)" -- "$cur") )
  125. }
  126. # Finds the position of the first word that is neither option nor an option's argument.
  127. # If there are options that require arguments, you should pass a glob describing those
  128. # options, e.g. "--option1|-o|--option2"
  129. # Use this function to restrict completions to exact positions after the argument list.
  130. __docker_pos_first_nonflag() {
  131. local argument_flags=$1
  132. local counter=$((command_pos + 1))
  133. while [ $counter -le $cword ]; do
  134. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  135. (( counter++ ))
  136. # eat "=" in case of --option=arg syntax
  137. [ "${words[$counter]}" = "=" ] && (( counter++ ))
  138. else
  139. case "${words[$counter]}" in
  140. -*)
  141. ;;
  142. *)
  143. break
  144. ;;
  145. esac
  146. fi
  147. # Bash splits words at "=", retaining "=" as a word, examples:
  148. # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
  149. while [ "${words[$counter + 1]}" = "=" ] ; do
  150. counter=$(( counter + 2))
  151. done
  152. (( counter++ ))
  153. done
  154. echo $counter
  155. }
  156. # Returns the value of the first option matching option_glob.
  157. # Valid values for option_glob are option names like '--log-level' and
  158. # globs like '--log-level|-l'
  159. # Only positions between the command and the current word are considered.
  160. __docker_value_of_option() {
  161. local option_extglob=$(__docker_to_extglob "$1")
  162. local counter=$((command_pos + 1))
  163. while [ $counter -lt $cword ]; do
  164. case ${words[$counter]} in
  165. $option_extglob )
  166. echo ${words[$counter + 1]}
  167. break
  168. ;;
  169. esac
  170. (( counter++ ))
  171. done
  172. }
  173. # Transforms a multiline list of strings into a single line string
  174. # with the words separated by "|".
  175. # This is used to prepare arguments to __docker_pos_first_nonflag().
  176. __docker_to_alternatives() {
  177. local parts=( $1 )
  178. local IFS='|'
  179. echo "${parts[*]}"
  180. }
  181. # Transforms a multiline list of options into an extglob pattern
  182. # suitable for use in case statements.
  183. __docker_to_extglob() {
  184. local extglob=$( __docker_to_alternatives "$1" )
  185. echo "@($extglob)"
  186. }
  187. # suppress trailing whitespace
  188. __docker_nospace() {
  189. # compopt is not available in ancient bash versions
  190. type compopt &>/dev/null && compopt -o nospace
  191. }
  192. __docker_resolve_hostname() {
  193. command -v host >/dev/null 2>&1 || return
  194. COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
  195. }
  196. __docker_capabilities() {
  197. # The list of capabilities is defined in types.go, ALL was added manually.
  198. COMPREPLY=( $( compgen -W "
  199. ALL
  200. AUDIT_CONTROL
  201. AUDIT_WRITE
  202. AUDIT_READ
  203. BLOCK_SUSPEND
  204. CHOWN
  205. DAC_OVERRIDE
  206. DAC_READ_SEARCH
  207. FOWNER
  208. FSETID
  209. IPC_LOCK
  210. IPC_OWNER
  211. KILL
  212. LEASE
  213. LINUX_IMMUTABLE
  214. MAC_ADMIN
  215. MAC_OVERRIDE
  216. MKNOD
  217. NET_ADMIN
  218. NET_BIND_SERVICE
  219. NET_BROADCAST
  220. NET_RAW
  221. SETFCAP
  222. SETGID
  223. SETPCAP
  224. SETUID
  225. SYS_ADMIN
  226. SYS_BOOT
  227. SYS_CHROOT
  228. SYSLOG
  229. SYS_MODULE
  230. SYS_NICE
  231. SYS_PACCT
  232. SYS_PTRACE
  233. SYS_RAWIO
  234. SYS_RESOURCE
  235. SYS_TIME
  236. SYS_TTY_CONFIG
  237. WAKE_ALARM
  238. " -- "$cur" ) )
  239. }
  240. __docker_log_drivers() {
  241. COMPREPLY=( $( compgen -W "
  242. fluentd
  243. gelf
  244. journald
  245. json-file
  246. none
  247. syslog
  248. " -- "$cur" ) )
  249. }
  250. __docker_log_driver_options() {
  251. # see docs/reference/logging/index.md
  252. local fluentd_options="fluentd-address tag"
  253. local gelf_options="gelf-address tag"
  254. local json_file_options="max-file max-size"
  255. local syslog_options="syslog-address syslog-facility tag"
  256. local awslogs_options="awslogs-region awslogs-group awslogs-stream"
  257. case $(__docker_value_of_option --log-driver) in
  258. '')
  259. COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $json_file_options $syslog_options" -S = -- "$cur" ) )
  260. ;;
  261. fluentd)
  262. COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
  263. ;;
  264. gelf)
  265. COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
  266. ;;
  267. json-file)
  268. COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
  269. ;;
  270. syslog)
  271. COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
  272. ;;
  273. awslogs)
  274. COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
  275. ;;
  276. *)
  277. return
  278. ;;
  279. esac
  280. __docker_nospace
  281. }
  282. __docker_complete_log_driver_options() {
  283. # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
  284. # it is the last character or not. So we search for "xxx=" in the the last two words.
  285. case "${words[$cword-2]}$prev=" in
  286. *gelf-address=*)
  287. COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) )
  288. __docker_nospace
  289. return
  290. ;;
  291. *syslog-address=*)
  292. COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
  293. __docker_nospace
  294. return
  295. ;;
  296. *syslog-facility=*)
  297. COMPREPLY=( $( compgen -W "
  298. auth
  299. authpriv
  300. cron
  301. daemon
  302. ftp
  303. kern
  304. local0
  305. local1
  306. local2
  307. local3
  308. local4
  309. local5
  310. local6
  311. local7
  312. lpr
  313. mail
  314. news
  315. syslog
  316. user
  317. uucp
  318. " -- "${cur#=}" ) )
  319. return
  320. ;;
  321. esac
  322. return 1
  323. }
  324. __docker_log_levels() {
  325. COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
  326. }
  327. # a selection of the available signals that is most likely of interest in the
  328. # context of docker containers.
  329. __docker_signals() {
  330. local signals=(
  331. SIGCONT
  332. SIGHUP
  333. SIGINT
  334. SIGKILL
  335. SIGQUIT
  336. SIGSTOP
  337. SIGTERM
  338. SIGUSR1
  339. SIGUSR2
  340. )
  341. COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  342. }
  343. # global options that may appear after the docker command
  344. _docker_docker() {
  345. local boolean_options="
  346. $global_boolean_options
  347. --help
  348. --version -v
  349. "
  350. case "$prev" in
  351. --config)
  352. _filedir -d
  353. return
  354. ;;
  355. --log-level|-l)
  356. __docker_log_levels
  357. return
  358. ;;
  359. $(__docker_to_extglob "$global_options_with_args") )
  360. return
  361. ;;
  362. esac
  363. case "$cur" in
  364. -*)
  365. COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
  366. ;;
  367. *)
  368. local counter=$( __docker_pos_first_nonflag $(__docker_to_extglob "$global_options_with_args") )
  369. if [ $cword -eq $counter ]; then
  370. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  371. fi
  372. ;;
  373. esac
  374. }
  375. _docker_attach() {
  376. case "$cur" in
  377. -*)
  378. COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) )
  379. ;;
  380. *)
  381. local counter="$(__docker_pos_first_nonflag)"
  382. if [ $cword -eq $counter ]; then
  383. __docker_containers_running
  384. fi
  385. ;;
  386. esac
  387. }
  388. _docker_build() {
  389. case "$prev" in
  390. --cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap)
  391. return
  392. ;;
  393. --file|-f)
  394. _filedir
  395. return
  396. ;;
  397. --tag|-t)
  398. __docker_image_repos_and_tags
  399. return
  400. ;;
  401. esac
  402. case "$cur" in
  403. -*)
  404. COMPREPLY=( $( compgen -W "--cgroup-parent --cpuset-cpus --cpuset-mems --cpu-shares -c --cpu-period --cpu-quota --file -f --force-rm --help --memory -m --memory-swap --no-cache --pull --quiet -q --rm --tag -t --ulimit" -- "$cur" ) )
  405. ;;
  406. *)
  407. local counter="$(__docker_pos_first_nonflag '--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--file|-f|--memory|-m|--memory-swap|--tag|-t')"
  408. if [ $cword -eq $counter ]; then
  409. _filedir -d
  410. fi
  411. ;;
  412. esac
  413. }
  414. _docker_commit() {
  415. case "$prev" in
  416. --author|-a|--change|-c|--message|-m)
  417. return
  418. ;;
  419. esac
  420. case "$cur" in
  421. -*)
  422. COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
  423. ;;
  424. *)
  425. local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
  426. if [ $cword -eq $counter ]; then
  427. __docker_containers_all
  428. return
  429. fi
  430. (( counter++ ))
  431. if [ $cword -eq $counter ]; then
  432. __docker_image_repos_and_tags
  433. return
  434. fi
  435. ;;
  436. esac
  437. }
  438. _docker_cp() {
  439. case "$cur" in
  440. -*)
  441. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  442. ;;
  443. *)
  444. local counter=$(__docker_pos_first_nonflag)
  445. if [ $cword -eq $counter ]; then
  446. case "$cur" in
  447. *:)
  448. return
  449. ;;
  450. *)
  451. __docker_containers_all
  452. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  453. __docker_nospace
  454. return
  455. ;;
  456. esac
  457. fi
  458. (( counter++ ))
  459. if [ $cword -eq $counter ]; then
  460. _filedir -d
  461. return
  462. fi
  463. ;;
  464. esac
  465. }
  466. _docker_create() {
  467. _docker_run
  468. }
  469. _docker_daemon() {
  470. local boolean_options="
  471. $global_boolean_options
  472. --help
  473. --icc=false
  474. --ip-forward=false
  475. --ip-masq=false
  476. --iptables=false
  477. --ipv6
  478. --no-legacy-registry
  479. --selinux-enabled
  480. --userland-proxy=false
  481. "
  482. local options_with_args="
  483. $global_options_with_args
  484. --api-cors-header
  485. --bip
  486. --bridge -b
  487. --cluster-advertise
  488. --cluster-store
  489. --default-gateway
  490. --default-gateway-v6
  491. --default-ulimit
  492. --dns
  493. --dns-search
  494. --dns-opt
  495. --exec-driver -e
  496. --exec-opt
  497. --exec-root
  498. --fixed-cidr
  499. --fixed-cidr-v6
  500. --graph -g
  501. --group -G
  502. --insecure-registry
  503. --ip
  504. --label
  505. --log-driver
  506. --log-opt
  507. --mtu
  508. --pidfile -p
  509. --registry-mirror
  510. --storage-driver -s
  511. --storage-opt
  512. "
  513. case "$prev" in
  514. --cluster-store)
  515. COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
  516. __docker_nospace
  517. return
  518. ;;
  519. --exec-root|--graph|-g)
  520. _filedir -d
  521. return
  522. ;;
  523. --log-driver)
  524. __docker_log_drivers
  525. return
  526. ;;
  527. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  528. _filedir
  529. return
  530. ;;
  531. --storage-driver|-s)
  532. COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  533. return
  534. ;;
  535. --storage-opt)
  536. local devicemapper_options="
  537. dm.basesize
  538. dm.blkdiscard
  539. dm.blocksize
  540. dm.fs
  541. dm.loopdatasize
  542. dm.loopmetadatasize
  543. dm.mkfsarg
  544. dm.mountopt
  545. dm.override_udev_sync_check
  546. dm.thinpooldev
  547. "
  548. local zfs_options="zfs.fsname"
  549. case $(__docker_value_of_option '--storage-driver|-s') in
  550. '')
  551. COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) )
  552. ;;
  553. devicemapper)
  554. COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) )
  555. ;;
  556. zfs)
  557. COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
  558. ;;
  559. *)
  560. return
  561. ;;
  562. esac
  563. __docker_nospace
  564. return
  565. ;;
  566. --log-level|-l)
  567. __docker_log_levels
  568. return
  569. ;;
  570. --log-opt)
  571. __docker_log_driver_options
  572. return
  573. ;;
  574. $(__docker_to_extglob "$options_with_args") )
  575. return
  576. ;;
  577. esac
  578. __docker_complete_log_driver_options && return
  579. # completions for --storage-opt
  580. case "${words[$cword-2]}$prev=" in
  581. *dm.blkdiscard=*)
  582. COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
  583. return
  584. ;;
  585. *dm.fs=*)
  586. COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) )
  587. return
  588. ;;
  589. *dm.override_udev_sync_check=*)
  590. COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
  591. return
  592. ;;
  593. *dm.thinpooldev=*)
  594. _filedir
  595. return
  596. ;;
  597. esac
  598. case "$cur" in
  599. -*)
  600. COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
  601. ;;
  602. esac
  603. }
  604. _docker_diff() {
  605. case "$cur" in
  606. -*)
  607. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  608. ;;
  609. *)
  610. local counter=$(__docker_pos_first_nonflag)
  611. if [ $cword -eq $counter ]; then
  612. __docker_containers_all
  613. fi
  614. ;;
  615. esac
  616. }
  617. _docker_events() {
  618. case "$prev" in
  619. --filter|-f)
  620. COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
  621. __docker_nospace
  622. return
  623. ;;
  624. --since|--until)
  625. return
  626. ;;
  627. esac
  628. case "${words[$cword-2]}$prev=" in
  629. *container=*)
  630. cur="${cur#=}"
  631. __docker_containers_all
  632. return
  633. ;;
  634. *event=*)
  635. COMPREPLY=( $( compgen -W "
  636. attach
  637. commit
  638. copy
  639. create
  640. delete
  641. destroy
  642. die
  643. exec_create
  644. exec_start
  645. export
  646. import
  647. kill
  648. oom
  649. pause
  650. pull
  651. push
  652. rename
  653. resize
  654. restart
  655. start
  656. stop
  657. tag
  658. top
  659. unpause
  660. untag
  661. " -- "${cur#=}" ) )
  662. return
  663. ;;
  664. *image=*)
  665. cur="${cur#=}"
  666. __docker_images
  667. return
  668. ;;
  669. esac
  670. case "$cur" in
  671. -*)
  672. COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
  673. ;;
  674. esac
  675. }
  676. _docker_exec() {
  677. case "$prev" in
  678. --user|-u)
  679. return
  680. ;;
  681. esac
  682. case "$cur" in
  683. -*)
  684. COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) )
  685. ;;
  686. *)
  687. __docker_containers_running
  688. ;;
  689. esac
  690. }
  691. _docker_export() {
  692. case "$cur" in
  693. -*)
  694. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  695. ;;
  696. *)
  697. local counter=$(__docker_pos_first_nonflag)
  698. if [ $cword -eq $counter ]; then
  699. __docker_containers_all
  700. fi
  701. ;;
  702. esac
  703. }
  704. _docker_help() {
  705. local counter=$(__docker_pos_first_nonflag)
  706. if [ $cword -eq $counter ]; then
  707. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  708. fi
  709. }
  710. _docker_history() {
  711. case "$cur" in
  712. -*)
  713. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  714. ;;
  715. *)
  716. local counter=$(__docker_pos_first_nonflag)
  717. if [ $cword -eq $counter ]; then
  718. __docker_images
  719. fi
  720. ;;
  721. esac
  722. }
  723. _docker_images() {
  724. case "$prev" in
  725. --filter|-f)
  726. COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
  727. if [ "$COMPREPLY" = "label=" ]; then
  728. __docker_nospace
  729. fi
  730. return
  731. ;;
  732. esac
  733. case "${words[$cword-2]}$prev=" in
  734. *dangling=*)
  735. COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
  736. return
  737. ;;
  738. *label=*)
  739. return
  740. ;;
  741. esac
  742. case "$cur" in
  743. -*)
  744. COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
  745. ;;
  746. =)
  747. return
  748. ;;
  749. *)
  750. __docker_image_repos
  751. ;;
  752. esac
  753. }
  754. _docker_import() {
  755. case "$cur" in
  756. -*)
  757. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  758. ;;
  759. *)
  760. local counter=$(__docker_pos_first_nonflag)
  761. if [ $cword -eq $counter ]; then
  762. return
  763. fi
  764. (( counter++ ))
  765. if [ $cword -eq $counter ]; then
  766. __docker_image_repos_and_tags
  767. return
  768. fi
  769. ;;
  770. esac
  771. }
  772. _docker_info() {
  773. case "$cur" in
  774. -*)
  775. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  776. ;;
  777. esac
  778. }
  779. _docker_inspect() {
  780. case "$prev" in
  781. --format|-f)
  782. return
  783. ;;
  784. --type)
  785. COMPREPLY=( $( compgen -W "image container" -- "$cur" ) )
  786. return
  787. ;;
  788. esac
  789. case "$cur" in
  790. -*)
  791. COMPREPLY=( $( compgen -W "--format -f --type --help" -- "$cur" ) )
  792. ;;
  793. *)
  794. case $(__docker_value_of_option --type) in
  795. '')
  796. __docker_containers_and_images
  797. ;;
  798. container)
  799. __docker_containers_all
  800. ;;
  801. image)
  802. __docker_images
  803. ;;
  804. esac
  805. esac
  806. }
  807. _docker_kill() {
  808. case "$prev" in
  809. --signal|-s)
  810. __docker_signals
  811. return
  812. ;;
  813. esac
  814. case "$cur" in
  815. -*)
  816. COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
  817. ;;
  818. *)
  819. __docker_containers_running
  820. ;;
  821. esac
  822. }
  823. _docker_load() {
  824. case "$prev" in
  825. --input|-i)
  826. _filedir
  827. return
  828. ;;
  829. esac
  830. case "$cur" in
  831. -*)
  832. COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
  833. ;;
  834. esac
  835. }
  836. _docker_login() {
  837. case "$prev" in
  838. --email|-e|--password|-p|--username|-u)
  839. return
  840. ;;
  841. esac
  842. case "$cur" in
  843. -*)
  844. COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
  845. ;;
  846. esac
  847. }
  848. _docker_logout() {
  849. case "$cur" in
  850. -*)
  851. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  852. ;;
  853. esac
  854. }
  855. _docker_logs() {
  856. case "$prev" in
  857. --since|--tail)
  858. return
  859. ;;
  860. esac
  861. case "$cur" in
  862. -*)
  863. COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) )
  864. ;;
  865. *)
  866. local counter=$(__docker_pos_first_nonflag '--tail')
  867. if [ $cword -eq $counter ]; then
  868. __docker_containers_all
  869. fi
  870. ;;
  871. esac
  872. }
  873. _docker_pause() {
  874. case "$cur" in
  875. -*)
  876. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  877. ;;
  878. *)
  879. local counter=$(__docker_pos_first_nonflag)
  880. if [ $cword -eq $counter ]; then
  881. __docker_containers_pauseable
  882. fi
  883. ;;
  884. esac
  885. }
  886. _docker_port() {
  887. case "$cur" in
  888. -*)
  889. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  890. ;;
  891. *)
  892. local counter=$(__docker_pos_first_nonflag)
  893. if [ $cword -eq $counter ]; then
  894. __docker_containers_all
  895. fi
  896. ;;
  897. esac
  898. }
  899. _docker_ps() {
  900. case "$prev" in
  901. --before|--since)
  902. __docker_containers_all
  903. ;;
  904. --filter|-f)
  905. COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) )
  906. __docker_nospace
  907. return
  908. ;;
  909. --format|-n)
  910. return
  911. ;;
  912. esac
  913. case "${words[$cword-2]}$prev=" in
  914. *ancestor=*)
  915. cur="${cur#=}"
  916. __docker_images
  917. return
  918. ;;
  919. *id=*)
  920. cur="${cur#=}"
  921. __docker_container_ids
  922. return
  923. ;;
  924. *name=*)
  925. cur="${cur#=}"
  926. __docker_container_names
  927. return
  928. ;;
  929. *status=*)
  930. COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
  931. return
  932. ;;
  933. esac
  934. case "$cur" in
  935. -*)
  936. COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
  937. ;;
  938. esac
  939. }
  940. _docker_pull() {
  941. case "$cur" in
  942. -*)
  943. COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
  944. ;;
  945. *)
  946. local counter=$(__docker_pos_first_nonflag)
  947. if [ $cword -eq $counter ]; then
  948. for arg in "${COMP_WORDS[@]}"; do
  949. case "$arg" in
  950. --all-tags|-a)
  951. __docker_image_repos
  952. return
  953. ;;
  954. esac
  955. done
  956. __docker_image_repos_and_tags
  957. fi
  958. ;;
  959. esac
  960. }
  961. _docker_push() {
  962. case "$cur" in
  963. -*)
  964. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  965. ;;
  966. *)
  967. local counter=$(__docker_pos_first_nonflag)
  968. if [ $cword -eq $counter ]; then
  969. __docker_image_repos_and_tags
  970. fi
  971. ;;
  972. esac
  973. }
  974. _docker_rename() {
  975. case "$cur" in
  976. -*)
  977. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  978. ;;
  979. *)
  980. local counter=$(__docker_pos_first_nonflag)
  981. if [ $cword -eq $counter ]; then
  982. __docker_containers_all
  983. fi
  984. ;;
  985. esac
  986. }
  987. _docker_restart() {
  988. case "$prev" in
  989. --time|-t)
  990. return
  991. ;;
  992. esac
  993. case "$cur" in
  994. -*)
  995. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  996. ;;
  997. *)
  998. __docker_containers_all
  999. ;;
  1000. esac
  1001. }
  1002. _docker_rm() {
  1003. case "$cur" in
  1004. -*)
  1005. COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
  1006. ;;
  1007. *)
  1008. for arg in "${COMP_WORDS[@]}"; do
  1009. case "$arg" in
  1010. --force|-f)
  1011. __docker_containers_all
  1012. return
  1013. ;;
  1014. esac
  1015. done
  1016. __docker_containers_stopped
  1017. ;;
  1018. esac
  1019. }
  1020. _docker_rmi() {
  1021. case "$cur" in
  1022. -*)
  1023. COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
  1024. ;;
  1025. *)
  1026. __docker_images
  1027. ;;
  1028. esac
  1029. }
  1030. _docker_run() {
  1031. local options_with_args="
  1032. --add-host
  1033. --attach -a
  1034. --blkio-weight
  1035. --cap-add
  1036. --cap-drop
  1037. --cgroup-parent
  1038. --cidfile
  1039. --cpu-period
  1040. --cpu-quota
  1041. --cpuset-cpus
  1042. --cpuset-mems
  1043. --cpu-shares -c
  1044. --device
  1045. --dns
  1046. --dns-opt
  1047. --dns-search
  1048. --entrypoint
  1049. --env -e
  1050. --env-file
  1051. --expose
  1052. --group-add
  1053. --hostname -h
  1054. --ipc
  1055. --kernel-memory
  1056. --label-file
  1057. --label -l
  1058. --link
  1059. --log-driver
  1060. --log-opt
  1061. --lxc-conf
  1062. --mac-address
  1063. --memory -m
  1064. --memory-swap
  1065. --memory-swappiness
  1066. --memory-reservation
  1067. --name
  1068. --net
  1069. --pid
  1070. --publish -p
  1071. --restart
  1072. --security-opt
  1073. --stop-signal
  1074. --ulimit
  1075. --user -u
  1076. --uts
  1077. --volumes-from
  1078. --volume -v
  1079. --workdir -w
  1080. "
  1081. local all_options="$options_with_args
  1082. --disable-content-trust=false
  1083. --help
  1084. --interactive -i
  1085. --oom-kill-disable
  1086. --privileged
  1087. --publish-all -P
  1088. --read-only
  1089. --tty -t
  1090. "
  1091. [ "$command" = "run" ] && all_options="$all_options
  1092. --detach -d
  1093. --rm
  1094. --sig-proxy=false
  1095. "
  1096. local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
  1097. case "$prev" in
  1098. --add-host)
  1099. case "$cur" in
  1100. *:)
  1101. __docker_resolve_hostname
  1102. return
  1103. ;;
  1104. esac
  1105. ;;
  1106. --attach|-a)
  1107. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  1108. return
  1109. ;;
  1110. --cap-add|--cap-drop)
  1111. __docker_capabilities
  1112. return
  1113. ;;
  1114. --cidfile|--env-file|--label-file)
  1115. _filedir
  1116. return
  1117. ;;
  1118. --device|--volume|-v)
  1119. case "$cur" in
  1120. *:*)
  1121. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  1122. ;;
  1123. '')
  1124. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  1125. __docker_nospace
  1126. ;;
  1127. /*)
  1128. _filedir
  1129. __docker_nospace
  1130. ;;
  1131. esac
  1132. return
  1133. ;;
  1134. --env|-e)
  1135. COMPREPLY=( $( compgen -e -- "$cur" ) )
  1136. __docker_nospace
  1137. return
  1138. ;;
  1139. --ipc)
  1140. case "$cur" in
  1141. *:*)
  1142. cur="${cur#*:}"
  1143. __docker_containers_running
  1144. ;;
  1145. *)
  1146. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  1147. if [ "$COMPREPLY" = "container:" ]; then
  1148. __docker_nospace
  1149. fi
  1150. ;;
  1151. esac
  1152. return
  1153. ;;
  1154. --link)
  1155. case "$cur" in
  1156. *:*)
  1157. ;;
  1158. *)
  1159. __docker_containers_running
  1160. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  1161. __docker_nospace
  1162. ;;
  1163. esac
  1164. return
  1165. ;;
  1166. --log-driver)
  1167. __docker_log_drivers
  1168. return
  1169. ;;
  1170. --log-opt)
  1171. __docker_log_driver_options
  1172. return
  1173. ;;
  1174. --net)
  1175. case "$cur" in
  1176. container:*)
  1177. local cur=${cur#*:}
  1178. __docker_containers_all
  1179. ;;
  1180. *)
  1181. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  1182. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  1183. __docker_nospace
  1184. fi
  1185. ;;
  1186. esac
  1187. return
  1188. ;;
  1189. --restart)
  1190. case "$cur" in
  1191. on-failure:*)
  1192. ;;
  1193. *)
  1194. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  1195. ;;
  1196. esac
  1197. return
  1198. ;;
  1199. --security-opt)
  1200. case "$cur" in
  1201. label:*:*)
  1202. ;;
  1203. label:*)
  1204. local cur=${cur##*:}
  1205. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  1206. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  1207. __docker_nospace
  1208. fi
  1209. ;;
  1210. *)
  1211. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  1212. __docker_nospace
  1213. ;;
  1214. esac
  1215. return
  1216. ;;
  1217. --volumes-from)
  1218. __docker_containers_all
  1219. return
  1220. ;;
  1221. $options_with_args_glob )
  1222. return
  1223. ;;
  1224. esac
  1225. __docker_complete_log_driver_options && return
  1226. case "$cur" in
  1227. -*)
  1228. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  1229. ;;
  1230. *)
  1231. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  1232. if [ $cword -eq $counter ]; then
  1233. __docker_images
  1234. fi
  1235. ;;
  1236. esac
  1237. }
  1238. _docker_save() {
  1239. case "$prev" in
  1240. --output|-o)
  1241. _filedir
  1242. return
  1243. ;;
  1244. esac
  1245. case "$cur" in
  1246. -*)
  1247. COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
  1248. ;;
  1249. *)
  1250. __docker_images
  1251. ;;
  1252. esac
  1253. }
  1254. _docker_search() {
  1255. case "$prev" in
  1256. --stars|-s)
  1257. return
  1258. ;;
  1259. esac
  1260. case "$cur" in
  1261. -*)
  1262. COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
  1263. ;;
  1264. esac
  1265. }
  1266. _docker_start() {
  1267. case "$cur" in
  1268. -*)
  1269. COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
  1270. ;;
  1271. *)
  1272. __docker_containers_stopped
  1273. ;;
  1274. esac
  1275. }
  1276. _docker_stats() {
  1277. case "$cur" in
  1278. -*)
  1279. COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) )
  1280. ;;
  1281. *)
  1282. __docker_containers_running
  1283. ;;
  1284. esac
  1285. }
  1286. _docker_stop() {
  1287. case "$prev" in
  1288. --time|-t)
  1289. return
  1290. ;;
  1291. esac
  1292. case "$cur" in
  1293. -*)
  1294. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1295. ;;
  1296. *)
  1297. __docker_containers_running
  1298. ;;
  1299. esac
  1300. }
  1301. _docker_tag() {
  1302. case "$cur" in
  1303. -*)
  1304. COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
  1305. ;;
  1306. *)
  1307. local counter=$(__docker_pos_first_nonflag)
  1308. if [ $cword -eq $counter ]; then
  1309. __docker_image_repos_and_tags
  1310. return
  1311. fi
  1312. (( counter++ ))
  1313. if [ $cword -eq $counter ]; then
  1314. __docker_image_repos_and_tags
  1315. return
  1316. fi
  1317. ;;
  1318. esac
  1319. }
  1320. _docker_unpause() {
  1321. case "$cur" in
  1322. -*)
  1323. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1324. ;;
  1325. *)
  1326. local counter=$(__docker_pos_first_nonflag)
  1327. if [ $cword -eq $counter ]; then
  1328. __docker_containers_unpauseable
  1329. fi
  1330. ;;
  1331. esac
  1332. }
  1333. _docker_top() {
  1334. case "$cur" in
  1335. -*)
  1336. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1337. ;;
  1338. *)
  1339. local counter=$(__docker_pos_first_nonflag)
  1340. if [ $cword -eq $counter ]; then
  1341. __docker_containers_running
  1342. fi
  1343. ;;
  1344. esac
  1345. }
  1346. _docker_version() {
  1347. case "$cur" in
  1348. -*)
  1349. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1350. ;;
  1351. esac
  1352. }
  1353. _docker_volume_create() {
  1354. case "$prev" in
  1355. --driver|-d)
  1356. COMPREPLY=( $( compgen -W "local" -- "$cur" ) )
  1357. return
  1358. ;;
  1359. --name|--opt|-o)
  1360. return
  1361. ;;
  1362. esac
  1363. case "$cur" in
  1364. -*)
  1365. COMPREPLY=( $( compgen -W "--driver -d --help --name --opt -o" -- "$cur" ) )
  1366. ;;
  1367. esac
  1368. }
  1369. _docker_volume_inspect() {
  1370. case "$prev" in
  1371. --format|-f)
  1372. return
  1373. ;;
  1374. esac
  1375. case "$cur" in
  1376. -*)
  1377. COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
  1378. ;;
  1379. *)
  1380. __docker_volumes
  1381. ;;
  1382. esac
  1383. }
  1384. _docker_volume_ls() {
  1385. case "$prev" in
  1386. --filter|-f)
  1387. COMPREPLY=( $( compgen -W "dangling=true" -- "$cur" ) )
  1388. return
  1389. ;;
  1390. esac
  1391. case "$cur" in
  1392. -*)
  1393. COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) )
  1394. ;;
  1395. esac
  1396. }
  1397. _docker_volume_rm() {
  1398. case "$cur" in
  1399. -*)
  1400. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1401. ;;
  1402. *)
  1403. __docker_volumes
  1404. ;;
  1405. esac
  1406. }
  1407. _docker_volume() {
  1408. local subcommands=(
  1409. create
  1410. inspect
  1411. ls
  1412. rm
  1413. )
  1414. local counter=$(($command_pos + 1))
  1415. while [ $counter -lt $cword ]; do
  1416. case "${words[$counter]}" in
  1417. $(__docker_to_extglob "${subcommands[*]}") )
  1418. local subcommand=${words[$counter]}
  1419. local completions_func=_docker_volume_$subcommand
  1420. declare -F $completions_func >/dev/null && $completions_func
  1421. return
  1422. ;;
  1423. esac
  1424. (( counter++ ))
  1425. done
  1426. case "$cur" in
  1427. -*)
  1428. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1429. ;;
  1430. *)
  1431. COMPREPLY=( $( compgen -W "${subcommands[*]}" -- "$cur" ) )
  1432. ;;
  1433. esac
  1434. }
  1435. _docker_wait() {
  1436. case "$cur" in
  1437. -*)
  1438. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1439. ;;
  1440. *)
  1441. __docker_containers_all
  1442. ;;
  1443. esac
  1444. }
  1445. _docker() {
  1446. local previous_extglob_setting=$(shopt -p extglob)
  1447. shopt -s extglob
  1448. local commands=(
  1449. attach
  1450. build
  1451. commit
  1452. cp
  1453. create
  1454. daemon
  1455. diff
  1456. events
  1457. exec
  1458. export
  1459. history
  1460. images
  1461. import
  1462. info
  1463. inspect
  1464. kill
  1465. load
  1466. login
  1467. logout
  1468. logs
  1469. pause
  1470. port
  1471. ps
  1472. pull
  1473. push
  1474. rename
  1475. restart
  1476. rm
  1477. rmi
  1478. run
  1479. save
  1480. search
  1481. start
  1482. stats
  1483. stop
  1484. tag
  1485. top
  1486. unpause
  1487. version
  1488. volume
  1489. wait
  1490. )
  1491. # These options are valid as global options for all client commands
  1492. # and valid as command options for `docker daemon`
  1493. local global_boolean_options="
  1494. --debug -D
  1495. --tls
  1496. --tlsverify
  1497. "
  1498. local global_options_with_args="
  1499. --config
  1500. --host -H
  1501. --log-level -l
  1502. --tlscacert
  1503. --tlscert
  1504. --tlskey
  1505. "
  1506. local host config
  1507. COMPREPLY=()
  1508. local cur prev words cword
  1509. _get_comp_words_by_ref -n : cur prev words cword
  1510. local command='docker' command_pos=0
  1511. local counter=1
  1512. while [ $counter -lt $cword ]; do
  1513. case "${words[$counter]}" in
  1514. # save host so that completion can use custom daemon
  1515. --host|-H)
  1516. (( counter++ ))
  1517. host="${words[$counter]}"
  1518. ;;
  1519. # save config so that completion can use custom configuration directories
  1520. --config)
  1521. (( counter++ ))
  1522. config="${words[$counter]}"
  1523. ;;
  1524. $(__docker_to_extglob "$global_options_with_args") )
  1525. (( counter++ ))
  1526. ;;
  1527. -*)
  1528. ;;
  1529. =)
  1530. (( counter++ ))
  1531. ;;
  1532. *)
  1533. command="${words[$counter]}"
  1534. command_pos=$counter
  1535. break
  1536. ;;
  1537. esac
  1538. (( counter++ ))
  1539. done
  1540. local completions_func=_docker_${command}
  1541. declare -F $completions_func >/dev/null && $completions_func
  1542. eval "$previous_extglob_setting"
  1543. return 0
  1544. }
  1545. complete -F _docker docker