docker 17 KB

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