docker 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  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. BLOCK_SUSPEND
  118. CHOWN
  119. DAC_OVERRIDE
  120. DAC_READ_SEARCH
  121. FOWNER
  122. FSETID
  123. IPC_LOCK
  124. IPC_OWNER
  125. KILL
  126. LEASE
  127. LINUX_IMMUTABLE
  128. MAC_ADMIN
  129. MAC_OVERRIDE
  130. MKNOD
  131. NET_ADMIN
  132. NET_BIND_SERVICE
  133. NET_BROADCAST
  134. NET_RAW
  135. SETFCAP
  136. SETGID
  137. SETPCAP
  138. SETUID
  139. SYS_ADMIN
  140. SYS_BOOT
  141. SYS_CHROOT
  142. SYSLOG
  143. SYS_MODULE
  144. SYS_NICE
  145. SYS_PACCT
  146. SYS_PTRACE
  147. SYS_RAWIO
  148. SYS_RESOURCE
  149. SYS_TIME
  150. SYS_TTY_CONFIG
  151. WAKE_ALARM
  152. " -- "$cur" ) )
  153. }
  154. _docker_docker() {
  155. local boolean_options="
  156. --api-enable-cors
  157. --daemon -d
  158. --debug -D
  159. --help -h
  160. --icc
  161. --ip-forward
  162. --ip-masq
  163. --iptables
  164. --ipv6
  165. --selinux-enabled
  166. --tls
  167. --tlsverify
  168. --version -v
  169. "
  170. case "$prev" in
  171. --graph|-g)
  172. _filedir -d
  173. return
  174. ;;
  175. --log-level|-l)
  176. COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
  177. return
  178. ;;
  179. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  180. _filedir
  181. return
  182. ;;
  183. --storage-driver|-s)
  184. COMPREPLY=( $( compgen -W "aufs devicemapper btrfs overlay" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  185. return
  186. ;;
  187. $main_options_with_args_glob )
  188. return
  189. ;;
  190. esac
  191. case "$cur" in
  192. -*)
  193. COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
  194. ;;
  195. *)
  196. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  197. ;;
  198. esac
  199. }
  200. _docker_attach() {
  201. case "$cur" in
  202. -*)
  203. COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$cur" ) )
  204. ;;
  205. *)
  206. local counter="$(__docker_pos_first_nonflag)"
  207. if [ $cword -eq $counter ]; then
  208. __docker_containers_running
  209. fi
  210. ;;
  211. esac
  212. }
  213. _docker_build() {
  214. case "$prev" in
  215. --tag|-t)
  216. __docker_image_repos_and_tags
  217. return
  218. ;;
  219. esac
  220. case "$cur" in
  221. -*)
  222. COMPREPLY=( $( compgen -W "--force-rm --no-cache --quiet -q --rm --tag -t" -- "$cur" ) )
  223. ;;
  224. *)
  225. local counter="$(__docker_pos_first_nonflag '--tag|-t')"
  226. if [ $cword -eq $counter ]; then
  227. _filedir -d
  228. fi
  229. ;;
  230. esac
  231. }
  232. _docker_commit() {
  233. case "$prev" in
  234. --author|-a|--message|-m|--run)
  235. return
  236. ;;
  237. esac
  238. case "$cur" in
  239. -*)
  240. COMPREPLY=( $( compgen -W "--author -a --message -m --run" -- "$cur" ) )
  241. ;;
  242. *)
  243. local counter=$(__docker_pos_first_nonflag '--author|-a|--message|-m|--run')
  244. if [ $cword -eq $counter ]; then
  245. __docker_containers_all
  246. return
  247. fi
  248. (( counter++ ))
  249. if [ $cword -eq $counter ]; then
  250. __docker_image_repos_and_tags
  251. return
  252. fi
  253. ;;
  254. esac
  255. }
  256. _docker_cp() {
  257. local counter=$(__docker_pos_first_nonflag)
  258. if [ $cword -eq $counter ]; then
  259. case "$cur" in
  260. *:)
  261. return
  262. ;;
  263. *)
  264. __docker_containers_all
  265. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  266. compopt -o nospace
  267. return
  268. ;;
  269. esac
  270. fi
  271. (( counter++ ))
  272. if [ $cword -eq $counter ]; then
  273. _filedir
  274. return
  275. fi
  276. }
  277. _docker_create() {
  278. _docker_run
  279. }
  280. _docker_diff() {
  281. local counter=$(__docker_pos_first_nonflag)
  282. if [ $cword -eq $counter ]; then
  283. __docker_containers_all
  284. fi
  285. }
  286. _docker_events() {
  287. case "$prev" in
  288. --since)
  289. return
  290. ;;
  291. esac
  292. case "$cur" in
  293. -*)
  294. COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
  295. ;;
  296. esac
  297. }
  298. _docker_exec() {
  299. case "$cur" in
  300. -*)
  301. COMPREPLY=( $( compgen -W "--detach -d --interactive -i -t --tty" -- "$cur" ) )
  302. ;;
  303. *)
  304. __docker_containers_running
  305. ;;
  306. esac
  307. }
  308. _docker_export() {
  309. local counter=$(__docker_pos_first_nonflag)
  310. if [ $cword -eq $counter ]; then
  311. __docker_containers_all
  312. fi
  313. }
  314. _docker_help() {
  315. local counter=$(__docker_pos_first_nonflag)
  316. if [ $cword -eq $counter ]; then
  317. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  318. fi
  319. }
  320. _docker_history() {
  321. case "$cur" in
  322. -*)
  323. COMPREPLY=( $( compgen -W "--no-trunc --quiet -q" -- "$cur" ) )
  324. ;;
  325. *)
  326. local counter=$(__docker_pos_first_nonflag)
  327. if [ $cword -eq $counter ]; then
  328. __docker_image_repos_and_tags_and_ids
  329. fi
  330. ;;
  331. esac
  332. }
  333. _docker_images() {
  334. case "$cur" in
  335. -*)
  336. COMPREPLY=( $( compgen -W "--all -a --no-trunc --quiet -q" -- "$cur" ) )
  337. ;;
  338. *)
  339. local counter=$(__docker_pos_first_nonflag)
  340. if [ $cword -eq $counter ]; then
  341. __docker_image_repos
  342. fi
  343. ;;
  344. esac
  345. }
  346. _docker_import() {
  347. local counter=$(__docker_pos_first_nonflag)
  348. if [ $cword -eq $counter ]; then
  349. return
  350. fi
  351. (( counter++ ))
  352. if [ $cword -eq $counter ]; then
  353. __docker_image_repos_and_tags
  354. return
  355. fi
  356. }
  357. _docker_info() {
  358. return
  359. }
  360. _docker_inspect() {
  361. case "$prev" in
  362. --format|-f)
  363. return
  364. ;;
  365. esac
  366. case "$cur" in
  367. -*)
  368. COMPREPLY=( $( compgen -W "--format -f" -- "$cur" ) )
  369. ;;
  370. *)
  371. __docker_containers_and_images
  372. ;;
  373. esac
  374. }
  375. _docker_kill() {
  376. __docker_containers_running
  377. }
  378. _docker_load() {
  379. case "$prev" in
  380. --input|-i)
  381. _filedir
  382. return
  383. ;;
  384. esac
  385. case "$cur" in
  386. -*)
  387. COMPREPLY=( $( compgen -W "--input -i" -- "$cur" ) )
  388. ;;
  389. esac
  390. }
  391. _docker_login() {
  392. case "$prev" in
  393. --email|-e|--password|-p|--username|-u)
  394. return
  395. ;;
  396. esac
  397. case "$cur" in
  398. -*)
  399. COMPREPLY=( $( compgen -W "--email -e --password -p --username -u" -- "$cur" ) )
  400. ;;
  401. esac
  402. }
  403. _docker_logs() {
  404. case "$cur" in
  405. -*)
  406. COMPREPLY=( $( compgen -W "--follow -f" -- "$cur" ) )
  407. ;;
  408. *)
  409. local counter=$(__docker_pos_first_nonflag)
  410. if [ $cword -eq $counter ]; then
  411. __docker_containers_all
  412. fi
  413. ;;
  414. esac
  415. }
  416. _docker_pause() {
  417. local counter=$(__docker_pos_first_nonflag)
  418. if [ $cword -eq $counter ]; then
  419. __docker_containers_pauseable
  420. fi
  421. }
  422. _docker_port() {
  423. local counter=$(__docker_pos_first_nonflag)
  424. if [ $cword -eq $counter ]; then
  425. __docker_containers_all
  426. fi
  427. }
  428. _docker_ps() {
  429. case "$prev" in
  430. --before|--since)
  431. __docker_containers_all
  432. ;;
  433. -n)
  434. return
  435. ;;
  436. esac
  437. case "$cur" in
  438. -*)
  439. COMPREPLY=( $( compgen -W "--all -a --before --latest -l --no-trunc -n --quiet -q --size -s --since" -- "$cur" ) )
  440. ;;
  441. esac
  442. }
  443. _docker_pull() {
  444. case "$prev" in
  445. --tag|-t)
  446. return
  447. ;;
  448. esac
  449. case "$cur" in
  450. -*)
  451. COMPREPLY=( $( compgen -W "--tag -t" -- "$cur" ) )
  452. ;;
  453. *)
  454. local counter=$(__docker_pos_first_nonflag '--tag|-t')
  455. if [ $cword -eq $counter ]; then
  456. __docker_image_repos_and_tags
  457. fi
  458. ;;
  459. esac
  460. }
  461. _docker_push() {
  462. local counter=$(__docker_pos_first_nonflag)
  463. if [ $cword -eq $counter ]; then
  464. __docker_image_repos_and_tags
  465. fi
  466. }
  467. _docker_restart() {
  468. case "$prev" in
  469. --time|-t)
  470. return
  471. ;;
  472. esac
  473. case "$cur" in
  474. -*)
  475. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  476. ;;
  477. *)
  478. __docker_containers_all
  479. ;;
  480. esac
  481. }
  482. _docker_rm() {
  483. case "$cur" in
  484. -*)
  485. COMPREPLY=( $( compgen -W "--force -f --link -l --volumes -v" -- "$cur" ) )
  486. return
  487. ;;
  488. *)
  489. for arg in "${COMP_WORDS[@]}"; do
  490. case "$arg" in
  491. --force|-f)
  492. __docker_containers_all
  493. return
  494. ;;
  495. esac
  496. done
  497. __docker_containers_stopped
  498. return
  499. ;;
  500. esac
  501. }
  502. _docker_rmi() {
  503. __docker_image_repos_and_tags_and_ids
  504. }
  505. _docker_run() {
  506. local options_with_args="
  507. --add-host
  508. --attach -a
  509. --cap-add
  510. --cap-drop
  511. --cidfile
  512. --cpuset
  513. --cpu-shares -c
  514. --device
  515. --dns
  516. --dns-search
  517. --entrypoint
  518. --env -e
  519. --env-file
  520. --expose
  521. --hostname -h
  522. --ipc
  523. --link
  524. --lxc-conf
  525. --mac-address
  526. --memory -m
  527. --name
  528. --net
  529. --publish -p
  530. --restart
  531. --security-opt
  532. --user -u
  533. --volumes-from
  534. --volume -v
  535. --workdir -w
  536. "
  537. local all_options="$options_with_args
  538. --interactive -i
  539. --privileged
  540. --publish-all -P
  541. --tty -t
  542. "
  543. [ "$command" = "run" ] && all_options="$all_options
  544. --detach -d
  545. --rm
  546. --sig-proxy
  547. "
  548. local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
  549. case "$prev" in
  550. --add-host)
  551. case "$cur" in
  552. *:)
  553. __docker_resolve_hostname
  554. return
  555. ;;
  556. esac
  557. ;;
  558. --attach|-a)
  559. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  560. return
  561. ;;
  562. --cap-add|--cap-drop)
  563. __docker_capabilities
  564. return
  565. ;;
  566. --cidfile|--env-file)
  567. _filedir
  568. return
  569. ;;
  570. --device|-d|--volume)
  571. case "$cur" in
  572. *:*)
  573. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  574. ;;
  575. '')
  576. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  577. compopt -o nospace
  578. ;;
  579. /*)
  580. _filedir
  581. compopt -o nospace
  582. ;;
  583. esac
  584. return
  585. ;;
  586. --env|-e)
  587. COMPREPLY=( $( compgen -e -- "$cur" ) )
  588. compopt -o nospace
  589. return
  590. ;;
  591. --ipc)
  592. case "$cur" in
  593. *:*)
  594. cur="${cur#*:}"
  595. __docker_containers_running
  596. ;;
  597. *)
  598. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  599. if [ "$COMPREPLY" = "container:" ]; then
  600. compopt -o nospace
  601. fi
  602. ;;
  603. esac
  604. return
  605. ;;
  606. --link)
  607. case "$cur" in
  608. *:*)
  609. ;;
  610. *)
  611. __docker_containers_running
  612. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  613. compopt -o nospace
  614. ;;
  615. esac
  616. return
  617. ;;
  618. --net)
  619. case "$cur" in
  620. container:*)
  621. local cur=${cur#*:}
  622. __docker_containers_all
  623. ;;
  624. *)
  625. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  626. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  627. compopt -o nospace
  628. fi
  629. ;;
  630. esac
  631. return
  632. ;;
  633. --restart)
  634. case "$cur" in
  635. on-failure:*)
  636. ;;
  637. *)
  638. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  639. ;;
  640. esac
  641. return
  642. ;;
  643. --security-opt)
  644. case "$cur" in
  645. label:*:*)
  646. ;;
  647. label:*)
  648. local cur=${cur##*:}
  649. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  650. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  651. compopt -o nospace
  652. fi
  653. ;;
  654. *)
  655. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  656. compopt -o nospace
  657. ;;
  658. esac
  659. return
  660. ;;
  661. --volumes-from)
  662. __docker_containers_all
  663. return
  664. ;;
  665. $options_with_args_glob )
  666. return
  667. ;;
  668. esac
  669. case "$cur" in
  670. -*)
  671. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  672. ;;
  673. *)
  674. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  675. if [ $cword -eq $counter ]; then
  676. __docker_image_repos_and_tags_and_ids
  677. fi
  678. ;;
  679. esac
  680. }
  681. _docker_save() {
  682. case "$prev" in
  683. --output|-o)
  684. _filedir
  685. return
  686. ;;
  687. esac
  688. case "$cur" in
  689. -*)
  690. COMPREPLY=( $( compgen -W "-o --output" -- "$cur" ) )
  691. ;;
  692. *)
  693. __docker_image_repos_and_tags_and_ids
  694. ;;
  695. esac
  696. }
  697. _docker_search() {
  698. case "$prev" in
  699. --stars|-s)
  700. return
  701. ;;
  702. esac
  703. case "$cur" in
  704. -*)
  705. COMPREPLY=( $( compgen -W "--automated --no-trunc --stars -s" -- "$cur" ) )
  706. ;;
  707. esac
  708. }
  709. _docker_start() {
  710. case "$cur" in
  711. -*)
  712. COMPREPLY=( $( compgen -W "--attach -a --interactive -i" -- "$cur" ) )
  713. ;;
  714. *)
  715. __docker_containers_stopped
  716. ;;
  717. esac
  718. }
  719. _docker_stats() {
  720. __docker_containers_running
  721. }
  722. _docker_stop() {
  723. case "$prev" in
  724. --time|-t)
  725. return
  726. ;;
  727. esac
  728. case "$cur" in
  729. -*)
  730. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  731. ;;
  732. *)
  733. __docker_containers_running
  734. ;;
  735. esac
  736. }
  737. _docker_tag() {
  738. case "$cur" in
  739. -*)
  740. COMPREPLY=( $( compgen -W "--force -f" -- "$cur" ) )
  741. ;;
  742. *)
  743. local counter=$(__docker_pos_first_nonflag)
  744. if [ $cword -eq $counter ]; then
  745. __docker_image_repos_and_tags
  746. return
  747. fi
  748. (( counter++ ))
  749. if [ $cword -eq $counter ]; then
  750. __docker_image_repos_and_tags
  751. return
  752. fi
  753. ;;
  754. esac
  755. }
  756. _docker_unpause() {
  757. local counter=$(__docker_pos_first_nonflag)
  758. if [ $cword -eq $counter ]; then
  759. __docker_containers_unpauseable
  760. fi
  761. }
  762. _docker_top() {
  763. local counter=$(__docker_pos_first_nonflag)
  764. if [ $cword -eq $counter ]; then
  765. __docker_containers_running
  766. fi
  767. }
  768. _docker_version() {
  769. return
  770. }
  771. _docker_wait() {
  772. __docker_containers_all
  773. }
  774. _docker() {
  775. local previous_extglob_setting=$(shopt -p extglob)
  776. shopt -s extglob
  777. local commands=(
  778. attach
  779. build
  780. commit
  781. cp
  782. create
  783. diff
  784. events
  785. exec
  786. export
  787. history
  788. images
  789. import
  790. info
  791. insert
  792. inspect
  793. kill
  794. load
  795. login
  796. logs
  797. pause
  798. port
  799. ps
  800. pull
  801. push
  802. restart
  803. rm
  804. rmi
  805. run
  806. save
  807. search
  808. start
  809. stats
  810. stop
  811. tag
  812. top
  813. unpause
  814. version
  815. wait
  816. )
  817. local main_options_with_args="
  818. --bip
  819. --bridge -b
  820. --dns
  821. --dns-search
  822. --exec-driver -e
  823. --fixed-cidr
  824. --fixed-cidr-v6
  825. --graph -g
  826. --group -G
  827. --host -H
  828. --insecure-registry
  829. --ip
  830. --label
  831. --log-level -l
  832. --mtu
  833. --pidfile -p
  834. --registry-mirror
  835. --storage-driver -s
  836. --storage-opt
  837. --tlscacert
  838. --tlscert
  839. --tlskey
  840. "
  841. local main_options_with_args_glob=$(__docker_to_extglob "$main_options_with_args")
  842. COMPREPLY=()
  843. local cur prev words cword
  844. _get_comp_words_by_ref -n : cur prev words cword
  845. local command='docker' cpos=0
  846. local counter=1
  847. while [ $counter -lt $cword ]; do
  848. case "${words[$counter]}" in
  849. $main_options_with_args_glob )
  850. (( counter++ ))
  851. ;;
  852. -*)
  853. ;;
  854. *)
  855. command="${words[$counter]}"
  856. cpos=$counter
  857. (( cpos++ ))
  858. break
  859. ;;
  860. esac
  861. (( counter++ ))
  862. done
  863. local completions_func=_docker_${command}
  864. declare -F $completions_func >/dev/null && $completions_func
  865. eval "$previous_extglob_setting"
  866. return 0
  867. }
  868. complete -F _docker docker