docker 18 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  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. # Note:
  19. # Currently, the completions will not work if the docker daemon is not
  20. # bound to the default communication port/socket
  21. # If the docker daemon is using a unix socket for communication your user
  22. # must have access to the socket for the completions to function correctly
  23. #
  24. # Note for developers:
  25. # Please arrange options sorted alphabetically by long name with the short
  26. # options immediately following their corresponding long form.
  27. # This order should be applied to lists, alternatives and code blocks.
  28. __docker_q() {
  29. docker 2>/dev/null "$@"
  30. }
  31. __docker_containers_all() {
  32. local IFS=$'\n'
  33. local containers=( $(__docker_q ps -aq --no-trunc) )
  34. if [ "$1" ]; then
  35. containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
  36. fi
  37. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  38. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  39. unset IFS
  40. COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
  41. }
  42. __docker_containers_running() {
  43. __docker_containers_all '.State.Running'
  44. }
  45. __docker_containers_stopped() {
  46. __docker_containers_all 'not .State.Running'
  47. }
  48. __docker_containers_pauseable() {
  49. __docker_containers_all 'and .State.Running (not .State.Paused)'
  50. }
  51. __docker_containers_unpauseable() {
  52. __docker_containers_all '.State.Paused'
  53. }
  54. __docker_image_repos() {
  55. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  56. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  57. }
  58. __docker_image_repos_and_tags() {
  59. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  60. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  61. __ltrim_colon_completions "$cur"
  62. }
  63. __docker_image_repos_and_tags_and_ids() {
  64. local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
  65. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  66. __ltrim_colon_completions "$cur"
  67. }
  68. __docker_containers_and_images() {
  69. __docker_containers_all
  70. local containers=( "${COMPREPLY[@]}" )
  71. __docker_image_repos_and_tags_and_ids
  72. COMPREPLY+=( "${containers[@]}" )
  73. }
  74. __docker_pos_first_nonflag() {
  75. local argument_flags=$1
  76. local counter=$cpos
  77. while [ $counter -le $cword ]; do
  78. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  79. (( counter++ ))
  80. else
  81. case "${words[$counter]}" in
  82. -*)
  83. ;;
  84. *)
  85. break
  86. ;;
  87. esac
  88. fi
  89. (( counter++ ))
  90. done
  91. echo $counter
  92. }
  93. # Transforms a multiline list of strings into a single line string
  94. # with the words separated by "|".
  95. # This is used to prepare arguments to __docker_pos_first_nonflag().
  96. __docker_to_alternatives() {
  97. local parts=( $1 )
  98. local IFS='|'
  99. echo "${parts[*]}"
  100. }
  101. # Transforms a multiline list of options into an extglob pattern
  102. # suitable for use in case statements.
  103. __docker_to_extglob() {
  104. local extglob=$( __docker_to_alternatives "$1" )
  105. echo "@($extglob)"
  106. }
  107. __docker_resolve_hostname() {
  108. command -v host >/dev/null 2>&1 || return
  109. COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
  110. }
  111. __docker_capabilities() {
  112. # The list of capabilities is defined in types.go, ALL was added manually.
  113. COMPREPLY=( $( compgen -W "
  114. ALL
  115. AUDIT_CONTROL
  116. AUDIT_WRITE
  117. AUDIT_READ
  118. BLOCK_SUSPEND
  119. CHOWN
  120. DAC_OVERRIDE
  121. DAC_READ_SEARCH
  122. FOWNER
  123. FSETID
  124. IPC_LOCK
  125. IPC_OWNER
  126. KILL
  127. LEASE
  128. LINUX_IMMUTABLE
  129. MAC_ADMIN
  130. MAC_OVERRIDE
  131. MKNOD
  132. NET_ADMIN
  133. NET_BIND_SERVICE
  134. NET_BROADCAST
  135. NET_RAW
  136. SETFCAP
  137. SETGID
  138. SETPCAP
  139. SETUID
  140. SYS_ADMIN
  141. SYS_BOOT
  142. SYS_CHROOT
  143. SYSLOG
  144. SYS_MODULE
  145. SYS_NICE
  146. SYS_PACCT
  147. SYS_PTRACE
  148. SYS_RAWIO
  149. SYS_RESOURCE
  150. SYS_TIME
  151. SYS_TTY_CONFIG
  152. WAKE_ALARM
  153. " -- "$cur" ) )
  154. }
  155. # a selection of the available signals that is most likely of interest in the
  156. # context of docker containers.
  157. __docker_signals() {
  158. local signals=(
  159. SIGCONT
  160. SIGHUP
  161. SIGINT
  162. SIGKILL
  163. SIGQUIT
  164. SIGSTOP
  165. SIGTERM
  166. SIGUSR1
  167. SIGUSR2
  168. )
  169. COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  170. }
  171. _docker_docker() {
  172. local boolean_options="
  173. --daemon -d
  174. --debug -D
  175. --help -h
  176. --icc
  177. --ip-forward
  178. --ip-masq
  179. --iptables
  180. --ipv6
  181. --selinux-enabled
  182. --tls
  183. --tlsverify
  184. --version -v
  185. "
  186. case "$prev" in
  187. --graph|-g)
  188. _filedir -d
  189. return
  190. ;;
  191. --log-level|-l)
  192. COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
  193. return
  194. ;;
  195. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  196. _filedir
  197. return
  198. ;;
  199. --storage-driver|-s)
  200. COMPREPLY=( $( compgen -W "aufs devicemapper btrfs overlay" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  201. return
  202. ;;
  203. $main_options_with_args_glob )
  204. return
  205. ;;
  206. esac
  207. case "$cur" in
  208. -*)
  209. COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
  210. ;;
  211. *)
  212. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  213. ;;
  214. esac
  215. }
  216. _docker_attach() {
  217. case "$cur" in
  218. -*)
  219. COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$cur" ) )
  220. ;;
  221. *)
  222. local counter="$(__docker_pos_first_nonflag)"
  223. if [ $cword -eq $counter ]; then
  224. __docker_containers_running
  225. fi
  226. ;;
  227. esac
  228. }
  229. _docker_build() {
  230. case "$prev" in
  231. --tag|-t)
  232. __docker_image_repos_and_tags
  233. return
  234. ;;
  235. --file|-f)
  236. _filedir
  237. return
  238. ;;
  239. esac
  240. case "$cur" in
  241. -*)
  242. COMPREPLY=( $( compgen -W "--file -f --force-rm --no-cache --quiet -q --rm --tag -t" -- "$cur" ) )
  243. ;;
  244. *)
  245. local counter="$(__docker_pos_first_nonflag '--tag|-t')"
  246. if [ $cword -eq $counter ]; then
  247. _filedir -d
  248. fi
  249. ;;
  250. esac
  251. }
  252. _docker_commit() {
  253. case "$prev" in
  254. --author|-a|--message|-m|--run)
  255. return
  256. ;;
  257. esac
  258. case "$cur" in
  259. -*)
  260. COMPREPLY=( $( compgen -W "--author -a --message -m --run" -- "$cur" ) )
  261. ;;
  262. *)
  263. local counter=$(__docker_pos_first_nonflag '--author|-a|--message|-m|--run')
  264. if [ $cword -eq $counter ]; then
  265. __docker_containers_all
  266. return
  267. fi
  268. (( counter++ ))
  269. if [ $cword -eq $counter ]; then
  270. __docker_image_repos_and_tags
  271. return
  272. fi
  273. ;;
  274. esac
  275. }
  276. _docker_cp() {
  277. local counter=$(__docker_pos_first_nonflag)
  278. if [ $cword -eq $counter ]; then
  279. case "$cur" in
  280. *:)
  281. return
  282. ;;
  283. *)
  284. __docker_containers_all
  285. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  286. compopt -o nospace
  287. return
  288. ;;
  289. esac
  290. fi
  291. (( counter++ ))
  292. if [ $cword -eq $counter ]; then
  293. _filedir
  294. return
  295. fi
  296. }
  297. _docker_create() {
  298. _docker_run
  299. }
  300. _docker_diff() {
  301. local counter=$(__docker_pos_first_nonflag)
  302. if [ $cword -eq $counter ]; then
  303. __docker_containers_all
  304. fi
  305. }
  306. _docker_events() {
  307. case "$prev" in
  308. --filter|-f)
  309. COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
  310. compopt -o nospace
  311. return
  312. ;;
  313. --since|--until)
  314. return
  315. ;;
  316. esac
  317. # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
  318. # it is the last character or not. So we search for "xxx=" in the the last two words.
  319. case "${words[$cword-2]}$prev=" in
  320. *container=*)
  321. cur="${cur#=}"
  322. __docker_containers_all
  323. return
  324. ;;
  325. *event=*)
  326. COMPREPLY=( $( compgen -W "create destroy die export kill pause restart start stop unpause" -- "${cur#=}" ) )
  327. return
  328. ;;
  329. *image=*)
  330. cur="${cur#=}"
  331. __docker_image_repos_and_tags_and_ids
  332. return
  333. ;;
  334. esac
  335. case "$cur" in
  336. -*)
  337. COMPREPLY=( $( compgen -W "--filter -f --since --until" -- "$cur" ) )
  338. ;;
  339. esac
  340. }
  341. _docker_exec() {
  342. case "$cur" in
  343. -*)
  344. COMPREPLY=( $( compgen -W "--detach -d --interactive -i -t --tty" -- "$cur" ) )
  345. ;;
  346. *)
  347. __docker_containers_running
  348. ;;
  349. esac
  350. }
  351. _docker_export() {
  352. local counter=$(__docker_pos_first_nonflag)
  353. if [ $cword -eq $counter ]; then
  354. __docker_containers_all
  355. fi
  356. }
  357. _docker_help() {
  358. local counter=$(__docker_pos_first_nonflag)
  359. if [ $cword -eq $counter ]; then
  360. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  361. fi
  362. }
  363. _docker_history() {
  364. case "$cur" in
  365. -*)
  366. COMPREPLY=( $( compgen -W "--no-trunc --quiet -q" -- "$cur" ) )
  367. ;;
  368. *)
  369. local counter=$(__docker_pos_first_nonflag)
  370. if [ $cword -eq $counter ]; then
  371. __docker_image_repos_and_tags_and_ids
  372. fi
  373. ;;
  374. esac
  375. }
  376. _docker_images() {
  377. case "$cur" in
  378. -*)
  379. COMPREPLY=( $( compgen -W "--all -a --no-trunc --quiet -q" -- "$cur" ) )
  380. ;;
  381. *)
  382. local counter=$(__docker_pos_first_nonflag)
  383. if [ $cword -eq $counter ]; then
  384. __docker_image_repos
  385. fi
  386. ;;
  387. esac
  388. }
  389. _docker_import() {
  390. local counter=$(__docker_pos_first_nonflag)
  391. if [ $cword -eq $counter ]; then
  392. return
  393. fi
  394. (( counter++ ))
  395. if [ $cword -eq $counter ]; then
  396. __docker_image_repos_and_tags
  397. return
  398. fi
  399. }
  400. _docker_info() {
  401. return
  402. }
  403. _docker_inspect() {
  404. case "$prev" in
  405. --format|-f)
  406. return
  407. ;;
  408. esac
  409. case "$cur" in
  410. -*)
  411. COMPREPLY=( $( compgen -W "--format -f" -- "$cur" ) )
  412. ;;
  413. *)
  414. __docker_containers_and_images
  415. ;;
  416. esac
  417. }
  418. _docker_kill() {
  419. case "$prev" in
  420. --signal|-s)
  421. __docker_signals
  422. return
  423. ;;
  424. esac
  425. case "$cur" in
  426. -*)
  427. COMPREPLY=( $( compgen -W "--signal -s" -- "$cur" ) )
  428. ;;
  429. *)
  430. __docker_containers_running
  431. ;;
  432. esac
  433. }
  434. _docker_load() {
  435. case "$prev" in
  436. --input|-i)
  437. _filedir
  438. return
  439. ;;
  440. esac
  441. case "$cur" in
  442. -*)
  443. COMPREPLY=( $( compgen -W "--input -i" -- "$cur" ) )
  444. ;;
  445. esac
  446. }
  447. _docker_login() {
  448. case "$prev" in
  449. --email|-e|--password|-p|--username|-u)
  450. return
  451. ;;
  452. esac
  453. case "$cur" in
  454. -*)
  455. COMPREPLY=( $( compgen -W "--email -e --password -p --username -u" -- "$cur" ) )
  456. ;;
  457. esac
  458. }
  459. _docker_logs() {
  460. case "$cur" in
  461. -*)
  462. COMPREPLY=( $( compgen -W "--follow -f" -- "$cur" ) )
  463. ;;
  464. *)
  465. local counter=$(__docker_pos_first_nonflag)
  466. if [ $cword -eq $counter ]; then
  467. __docker_containers_all
  468. fi
  469. ;;
  470. esac
  471. }
  472. _docker_pause() {
  473. local counter=$(__docker_pos_first_nonflag)
  474. if [ $cword -eq $counter ]; then
  475. __docker_containers_pauseable
  476. fi
  477. }
  478. _docker_port() {
  479. local counter=$(__docker_pos_first_nonflag)
  480. if [ $cword -eq $counter ]; then
  481. __docker_containers_all
  482. fi
  483. }
  484. _docker_ps() {
  485. case "$prev" in
  486. --before|--since)
  487. __docker_containers_all
  488. ;;
  489. -n)
  490. return
  491. ;;
  492. esac
  493. case "$cur" in
  494. -*)
  495. COMPREPLY=( $( compgen -W "--all -a --before --latest -l --no-trunc -n --quiet -q --size -s --since" -- "$cur" ) )
  496. ;;
  497. esac
  498. }
  499. _docker_pull() {
  500. case "$prev" in
  501. --tag|-t)
  502. return
  503. ;;
  504. esac
  505. case "$cur" in
  506. -*)
  507. COMPREPLY=( $( compgen -W "--tag -t" -- "$cur" ) )
  508. ;;
  509. *)
  510. local counter=$(__docker_pos_first_nonflag '--tag|-t')
  511. if [ $cword -eq $counter ]; then
  512. __docker_image_repos_and_tags
  513. fi
  514. ;;
  515. esac
  516. }
  517. _docker_push() {
  518. local counter=$(__docker_pos_first_nonflag)
  519. if [ $cword -eq $counter ]; then
  520. __docker_image_repos_and_tags
  521. fi
  522. }
  523. _docker_rename() {
  524. local counter=$(__docker_pos_first_nonflag)
  525. if [ $cword -eq $counter ]; then
  526. __docker_containers_all
  527. fi
  528. }
  529. _docker_restart() {
  530. case "$prev" in
  531. --time|-t)
  532. return
  533. ;;
  534. esac
  535. case "$cur" in
  536. -*)
  537. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  538. ;;
  539. *)
  540. __docker_containers_all
  541. ;;
  542. esac
  543. }
  544. _docker_rm() {
  545. case "$cur" in
  546. -*)
  547. COMPREPLY=( $( compgen -W "--force -f --link -l --volumes -v" -- "$cur" ) )
  548. return
  549. ;;
  550. *)
  551. for arg in "${COMP_WORDS[@]}"; do
  552. case "$arg" in
  553. --force|-f)
  554. __docker_containers_all
  555. return
  556. ;;
  557. esac
  558. done
  559. __docker_containers_stopped
  560. return
  561. ;;
  562. esac
  563. }
  564. _docker_rmi() {
  565. __docker_image_repos_and_tags_and_ids
  566. }
  567. _docker_run() {
  568. local options_with_args="
  569. --add-host
  570. --attach -a
  571. --cap-add
  572. --cap-drop
  573. --cidfile
  574. --cpuset
  575. --cpu-shares -c
  576. --device
  577. --dns
  578. --dns-search
  579. --entrypoint
  580. --env -e
  581. --env-file
  582. --expose
  583. --hostname -h
  584. --ipc
  585. --link
  586. --lxc-conf
  587. --mac-address
  588. --memory -m
  589. --memory-swap
  590. --name
  591. --net
  592. --pid
  593. --publish -p
  594. --restart
  595. --security-opt
  596. --user -u
  597. --ulimit
  598. --volumes-from
  599. --volume -v
  600. --workdir -w
  601. "
  602. local all_options="$options_with_args
  603. --help
  604. --interactive -i
  605. --privileged
  606. --publish-all -P
  607. --read-only
  608. --tty -t
  609. "
  610. [ "$command" = "run" ] && all_options="$all_options
  611. --detach -d
  612. --rm
  613. --sig-proxy
  614. "
  615. local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
  616. case "$prev" in
  617. --add-host)
  618. case "$cur" in
  619. *:)
  620. __docker_resolve_hostname
  621. return
  622. ;;
  623. esac
  624. ;;
  625. --attach|-a)
  626. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  627. return
  628. ;;
  629. --cap-add|--cap-drop)
  630. __docker_capabilities
  631. return
  632. ;;
  633. --cidfile|--env-file)
  634. _filedir
  635. return
  636. ;;
  637. --device|--volume|-v)
  638. case "$cur" in
  639. *:*)
  640. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  641. ;;
  642. '')
  643. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  644. compopt -o nospace
  645. ;;
  646. /*)
  647. _filedir
  648. compopt -o nospace
  649. ;;
  650. esac
  651. return
  652. ;;
  653. --env|-e)
  654. COMPREPLY=( $( compgen -e -- "$cur" ) )
  655. compopt -o nospace
  656. return
  657. ;;
  658. --ipc)
  659. case "$cur" in
  660. *:*)
  661. cur="${cur#*:}"
  662. __docker_containers_running
  663. ;;
  664. *)
  665. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  666. if [ "$COMPREPLY" = "container:" ]; then
  667. compopt -o nospace
  668. fi
  669. ;;
  670. esac
  671. return
  672. ;;
  673. --link)
  674. case "$cur" in
  675. *:*)
  676. ;;
  677. *)
  678. __docker_containers_running
  679. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  680. compopt -o nospace
  681. ;;
  682. esac
  683. return
  684. ;;
  685. --net)
  686. case "$cur" in
  687. container:*)
  688. local cur=${cur#*:}
  689. __docker_containers_all
  690. ;;
  691. *)
  692. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  693. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  694. compopt -o nospace
  695. fi
  696. ;;
  697. esac
  698. return
  699. ;;
  700. --restart)
  701. case "$cur" in
  702. on-failure:*)
  703. ;;
  704. *)
  705. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  706. ;;
  707. esac
  708. return
  709. ;;
  710. --security-opt)
  711. case "$cur" in
  712. label:*:*)
  713. ;;
  714. label:*)
  715. local cur=${cur##*:}
  716. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  717. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  718. compopt -o nospace
  719. fi
  720. ;;
  721. *)
  722. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  723. compopt -o nospace
  724. ;;
  725. esac
  726. return
  727. ;;
  728. --volumes-from)
  729. __docker_containers_all
  730. return
  731. ;;
  732. $options_with_args_glob )
  733. return
  734. ;;
  735. esac
  736. case "$cur" in
  737. -*)
  738. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  739. ;;
  740. *)
  741. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  742. if [ $cword -eq $counter ]; then
  743. __docker_image_repos_and_tags_and_ids
  744. fi
  745. ;;
  746. esac
  747. }
  748. _docker_save() {
  749. case "$prev" in
  750. --output|-o)
  751. _filedir
  752. return
  753. ;;
  754. esac
  755. case "$cur" in
  756. -*)
  757. COMPREPLY=( $( compgen -W "-o --output" -- "$cur" ) )
  758. ;;
  759. *)
  760. __docker_image_repos_and_tags_and_ids
  761. ;;
  762. esac
  763. }
  764. _docker_search() {
  765. case "$prev" in
  766. --stars|-s)
  767. return
  768. ;;
  769. esac
  770. case "$cur" in
  771. -*)
  772. COMPREPLY=( $( compgen -W "--automated --no-trunc --stars -s" -- "$cur" ) )
  773. ;;
  774. esac
  775. }
  776. _docker_start() {
  777. case "$cur" in
  778. -*)
  779. COMPREPLY=( $( compgen -W "--attach -a --interactive -i" -- "$cur" ) )
  780. ;;
  781. *)
  782. __docker_containers_stopped
  783. ;;
  784. esac
  785. }
  786. _docker_stats() {
  787. __docker_containers_running
  788. }
  789. _docker_stop() {
  790. case "$prev" in
  791. --time|-t)
  792. return
  793. ;;
  794. esac
  795. case "$cur" in
  796. -*)
  797. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  798. ;;
  799. *)
  800. __docker_containers_running
  801. ;;
  802. esac
  803. }
  804. _docker_tag() {
  805. case "$cur" in
  806. -*)
  807. COMPREPLY=( $( compgen -W "--force -f" -- "$cur" ) )
  808. ;;
  809. *)
  810. local counter=$(__docker_pos_first_nonflag)
  811. if [ $cword -eq $counter ]; then
  812. __docker_image_repos_and_tags
  813. return
  814. fi
  815. (( counter++ ))
  816. if [ $cword -eq $counter ]; then
  817. __docker_image_repos_and_tags
  818. return
  819. fi
  820. ;;
  821. esac
  822. }
  823. _docker_unpause() {
  824. local counter=$(__docker_pos_first_nonflag)
  825. if [ $cword -eq $counter ]; then
  826. __docker_containers_unpauseable
  827. fi
  828. }
  829. _docker_top() {
  830. local counter=$(__docker_pos_first_nonflag)
  831. if [ $cword -eq $counter ]; then
  832. __docker_containers_running
  833. fi
  834. }
  835. _docker_version() {
  836. return
  837. }
  838. _docker_wait() {
  839. __docker_containers_all
  840. }
  841. _docker() {
  842. local previous_extglob_setting=$(shopt -p extglob)
  843. shopt -s extglob
  844. local commands=(
  845. attach
  846. build
  847. commit
  848. cp
  849. create
  850. diff
  851. events
  852. exec
  853. export
  854. history
  855. images
  856. import
  857. info
  858. insert
  859. inspect
  860. kill
  861. load
  862. login
  863. logs
  864. pause
  865. port
  866. ps
  867. pull
  868. push
  869. rename
  870. restart
  871. rm
  872. rmi
  873. run
  874. save
  875. search
  876. start
  877. stats
  878. stop
  879. tag
  880. top
  881. unpause
  882. version
  883. wait
  884. )
  885. local main_options_with_args="
  886. --api-cors-header
  887. --bip
  888. --bridge -b
  889. --default-ulimit
  890. --dns
  891. --dns-search
  892. --exec-driver -e
  893. --fixed-cidr
  894. --fixed-cidr-v6
  895. --graph -g
  896. --group -G
  897. --host -H
  898. --insecure-registry
  899. --ip
  900. --label
  901. --log-level -l
  902. --mtu
  903. --pidfile -p
  904. --registry-mirror
  905. --storage-driver -s
  906. --storage-opt
  907. --tlscacert
  908. --tlscert
  909. --tlskey
  910. "
  911. local main_options_with_args_glob=$(__docker_to_extglob "$main_options_with_args")
  912. COMPREPLY=()
  913. local cur prev words cword
  914. _get_comp_words_by_ref -n : cur prev words cword
  915. local command='docker' cpos=0
  916. local counter=1
  917. while [ $counter -lt $cword ]; do
  918. case "${words[$counter]}" in
  919. $main_options_with_args_glob )
  920. (( counter++ ))
  921. ;;
  922. -*)
  923. ;;
  924. *)
  925. command="${words[$counter]}"
  926. cpos=$counter
  927. (( cpos++ ))
  928. break
  929. ;;
  930. esac
  931. (( counter++ ))
  932. done
  933. local completions_func=_docker_${command}
  934. declare -F $completions_func >/dev/null && $completions_func
  935. eval "$previous_extglob_setting"
  936. return 0
  937. }
  938. complete -F _docker docker