docker 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. #!bash
  2. #
  3. # bash completion file for core docker commands
  4. #
  5. # This script provides supports 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 and add the line below to your .bashrc after
  15. # bash completion features are loaded
  16. # . docker.bash
  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. __docker_q() {
  24. docker 2>/dev/null "$@"
  25. }
  26. __docker_containers_all() {
  27. local IFS=$'\n'
  28. local containers=( $(__docker_q ps -aq --no-trunc) )
  29. if [ "$1" ]; then
  30. containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
  31. fi
  32. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  33. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  34. unset IFS
  35. COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
  36. }
  37. __docker_containers_running() {
  38. __docker_containers_all '.State.Running'
  39. }
  40. __docker_containers_stopped() {
  41. __docker_containers_all 'not .State.Running'
  42. }
  43. __docker_containers_pauseable() {
  44. __docker_containers_all 'and .State.Running (not .State.Paused)'
  45. }
  46. __docker_containers_unpauseable() {
  47. __docker_containers_all '.State.Paused'
  48. }
  49. __docker_image_repos() {
  50. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  51. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  52. }
  53. __docker_image_repos_and_tags() {
  54. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  55. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  56. __ltrim_colon_completions "$cur"
  57. }
  58. __docker_image_repos_and_tags_and_ids() {
  59. local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
  60. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  61. __ltrim_colon_completions "$cur"
  62. }
  63. __docker_containers_and_images() {
  64. __docker_containers_all
  65. local containers=( "${COMPREPLY[@]}" )
  66. __docker_image_repos_and_tags_and_ids
  67. COMPREPLY+=( "${containers[@]}" )
  68. }
  69. __docker_pos_first_nonflag() {
  70. local argument_flags=$1
  71. local counter=$cpos
  72. while [ $counter -le $cword ]; do
  73. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  74. (( counter++ ))
  75. else
  76. case "${words[$counter]}" in
  77. -*)
  78. ;;
  79. *)
  80. break
  81. ;;
  82. esac
  83. fi
  84. (( counter++ ))
  85. done
  86. echo $counter
  87. }
  88. _docker_docker() {
  89. case "$prev" in
  90. -H)
  91. return
  92. ;;
  93. *)
  94. ;;
  95. esac
  96. case "$cur" in
  97. -*)
  98. COMPREPLY=( $( compgen -W "-H" -- "$cur" ) )
  99. ;;
  100. *)
  101. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  102. ;;
  103. esac
  104. }
  105. _docker_attach() {
  106. case "$cur" in
  107. -*)
  108. COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$cur" ) )
  109. ;;
  110. *)
  111. local counter="$(__docker_pos_first_nonflag)"
  112. if [ $cword -eq $counter ]; then
  113. __docker_containers_running
  114. fi
  115. ;;
  116. esac
  117. }
  118. _docker_build() {
  119. case "$prev" in
  120. -t|--tag)
  121. __docker_image_repos_and_tags
  122. return
  123. ;;
  124. *)
  125. ;;
  126. esac
  127. case "$cur" in
  128. -*)
  129. COMPREPLY=( $( compgen -W "-t --tag -q --quiet --no-cache --rm --force-rm" -- "$cur" ) )
  130. ;;
  131. *)
  132. local counter="$(__docker_pos_first_nonflag '-t|--tag')"
  133. if [ $cword -eq $counter ]; then
  134. _filedir -d
  135. fi
  136. ;;
  137. esac
  138. }
  139. _docker_commit() {
  140. case "$prev" in
  141. -m|--message|-a|--author|--run)
  142. return
  143. ;;
  144. *)
  145. ;;
  146. esac
  147. case "$cur" in
  148. -*)
  149. COMPREPLY=( $( compgen -W "-m --message -a --author --run" -- "$cur" ) )
  150. ;;
  151. *)
  152. local counter=$(__docker_pos_first_nonflag '-m|--message|-a|--author|--run')
  153. if [ $cword -eq $counter ]; then
  154. __docker_containers_all
  155. return
  156. fi
  157. (( counter++ ))
  158. if [ $cword -eq $counter ]; then
  159. __docker_image_repos_and_tags
  160. return
  161. fi
  162. ;;
  163. esac
  164. }
  165. _docker_cp() {
  166. local counter=$(__docker_pos_first_nonflag)
  167. if [ $cword -eq $counter ]; then
  168. case "$cur" in
  169. *:)
  170. return
  171. ;;
  172. *)
  173. __docker_containers_all
  174. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  175. compopt -o nospace
  176. return
  177. ;;
  178. esac
  179. fi
  180. (( counter++ ))
  181. if [ $cword -eq $counter ]; then
  182. _filedir
  183. return
  184. fi
  185. }
  186. _docker_create() {
  187. case "$prev" in
  188. -a|--attach)
  189. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  190. return
  191. ;;
  192. --cidfile|--env-file)
  193. _filedir
  194. return
  195. ;;
  196. --volumes-from)
  197. __docker_containers_all
  198. return
  199. ;;
  200. -v|--volume)
  201. case "$cur" in
  202. *:*)
  203. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  204. ;;
  205. '')
  206. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  207. compopt -o nospace
  208. ;;
  209. /*)
  210. _filedir
  211. compopt -o nospace
  212. ;;
  213. esac
  214. return
  215. ;;
  216. -e|--env)
  217. COMPREPLY=( $( compgen -e -- "$cur" ) )
  218. compopt -o nospace
  219. return
  220. ;;
  221. --link)
  222. case "$cur" in
  223. *:*)
  224. ;;
  225. *)
  226. __docker_containers_running
  227. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  228. compopt -o nospace
  229. ;;
  230. esac
  231. return
  232. ;;
  233. --entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|-c|--cpu-shares|-n|--name|-p|--publish|--expose|--dns|--lxc-conf)
  234. return
  235. ;;
  236. *)
  237. ;;
  238. esac
  239. case "$cur" in
  240. -*)
  241. COMPREPLY=( $( compgen -W "-n --networking --privileged -P --publish-all -i --interactive -t --tty --cidfile --entrypoint -h --hostname -m --memory -u --user -w --workdir -c --cpu-shares --name -a --attach -v --volume --link -e --env -p --publish --expose --dns --volumes-from --lxc-conf" -- "$cur" ) )
  242. ;;
  243. *)
  244. local counter=$(__docker_pos_first_nonflag '--cidfile|--volumes-from|-v|--volume|-e|--env|--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|-c|--cpu-shares|-n|--name|-a|--attach|--link|-p|--publish|--expose|--dns|--lxc-conf')
  245. if [ $cword -eq $counter ]; then
  246. __docker_image_repos_and_tags_and_ids
  247. fi
  248. ;;
  249. esac
  250. }
  251. _docker_diff() {
  252. local counter=$(__docker_pos_first_nonflag)
  253. if [ $cword -eq $counter ]; then
  254. __docker_containers_all
  255. fi
  256. }
  257. _docker_events() {
  258. case "$prev" in
  259. --since)
  260. return
  261. ;;
  262. *)
  263. ;;
  264. esac
  265. case "$cur" in
  266. -*)
  267. COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
  268. ;;
  269. *)
  270. ;;
  271. esac
  272. }
  273. _docker_exec() {
  274. case "$cur" in
  275. -*)
  276. COMPREPLY=( $( compgen -W "-d --detach -i --interactive -t --tty" -- "$cur" ) )
  277. ;;
  278. *)
  279. __docker_containers_running
  280. ;;
  281. esac
  282. }
  283. _docker_export() {
  284. local counter=$(__docker_pos_first_nonflag)
  285. if [ $cword -eq $counter ]; then
  286. __docker_containers_all
  287. fi
  288. }
  289. _docker_help() {
  290. local counter=$(__docker_pos_first_nonflag)
  291. if [ $cword -eq $counter ]; then
  292. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  293. fi
  294. }
  295. _docker_history() {
  296. case "$cur" in
  297. -*)
  298. COMPREPLY=( $( compgen -W "-q --quiet --no-trunc" -- "$cur" ) )
  299. ;;
  300. *)
  301. local counter=$(__docker_pos_first_nonflag)
  302. if [ $cword -eq $counter ]; then
  303. __docker_image_repos_and_tags_and_ids
  304. fi
  305. ;;
  306. esac
  307. }
  308. _docker_images() {
  309. case "$cur" in
  310. -*)
  311. COMPREPLY=( $( compgen -W "-q --quiet -a --all --no-trunc -v --viz -t --tree" -- "$cur" ) )
  312. ;;
  313. *)
  314. local counter=$(__docker_pos_first_nonflag)
  315. if [ $cword -eq $counter ]; then
  316. __docker_image_repos
  317. fi
  318. ;;
  319. esac
  320. }
  321. _docker_import() {
  322. local counter=$(__docker_pos_first_nonflag)
  323. if [ $cword -eq $counter ]; then
  324. return
  325. fi
  326. (( counter++ ))
  327. if [ $cword -eq $counter ]; then
  328. __docker_image_repos_and_tags
  329. return
  330. fi
  331. }
  332. _docker_info() {
  333. return
  334. }
  335. _docker_inspect() {
  336. case "$prev" in
  337. -f|--format)
  338. return
  339. ;;
  340. *)
  341. ;;
  342. esac
  343. case "$cur" in
  344. -*)
  345. COMPREPLY=( $( compgen -W "-f --format" -- "$cur" ) )
  346. ;;
  347. *)
  348. __docker_containers_and_images
  349. ;;
  350. esac
  351. }
  352. _docker_kill() {
  353. __docker_containers_running
  354. }
  355. _docker_load() {
  356. return
  357. }
  358. _docker_login() {
  359. case "$prev" in
  360. -u|--username|-p|--password|-e|--email)
  361. return
  362. ;;
  363. *)
  364. ;;
  365. esac
  366. case "$cur" in
  367. -*)
  368. COMPREPLY=( $( compgen -W "-u --username -p --password -e --email" -- "$cur" ) )
  369. ;;
  370. *)
  371. ;;
  372. esac
  373. }
  374. _docker_logs() {
  375. case "$cur" in
  376. -*)
  377. COMPREPLY=( $( compgen -W "-f --follow" -- "$cur" ) )
  378. ;;
  379. *)
  380. local counter=$(__docker_pos_first_nonflag)
  381. if [ $cword -eq $counter ]; then
  382. __docker_containers_all
  383. fi
  384. ;;
  385. esac
  386. }
  387. _docker_pause() {
  388. local counter=$(__docker_pos_first_nonflag)
  389. if [ $cword -eq $counter ]; then
  390. __docker_containers_pauseable
  391. fi
  392. }
  393. _docker_port() {
  394. local counter=$(__docker_pos_first_nonflag)
  395. if [ $cword -eq $counter ]; then
  396. __docker_containers_all
  397. fi
  398. }
  399. _docker_ps() {
  400. case "$prev" in
  401. --since|--before)
  402. __docker_containers_all
  403. ;;
  404. -n)
  405. return
  406. ;;
  407. *)
  408. ;;
  409. esac
  410. case "$cur" in
  411. -*)
  412. COMPREPLY=( $( compgen -W "-q --quiet -s --size -a --all --no-trunc -l --latest --since --before -n" -- "$cur" ) )
  413. ;;
  414. *)
  415. ;;
  416. esac
  417. }
  418. _docker_pull() {
  419. case "$prev" in
  420. -t|--tag)
  421. return
  422. ;;
  423. *)
  424. ;;
  425. esac
  426. case "$cur" in
  427. -*)
  428. COMPREPLY=( $( compgen -W "-t --tag" -- "$cur" ) )
  429. ;;
  430. *)
  431. local counter=$(__docker_pos_first_nonflag '-t|--tag')
  432. if [ $cword -eq $counter ]; then
  433. __docker_image_repos_and_tags
  434. fi
  435. ;;
  436. esac
  437. }
  438. _docker_push() {
  439. local counter=$(__docker_pos_first_nonflag)
  440. if [ $cword -eq $counter ]; then
  441. __docker_image_repos_and_tags
  442. fi
  443. }
  444. _docker_restart() {
  445. case "$prev" in
  446. -t|--time)
  447. return
  448. ;;
  449. *)
  450. ;;
  451. esac
  452. case "$cur" in
  453. -*)
  454. COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
  455. ;;
  456. *)
  457. __docker_containers_all
  458. ;;
  459. esac
  460. }
  461. _docker_rm() {
  462. case "$cur" in
  463. -*)
  464. COMPREPLY=( $( compgen -W "-f --force -l --link -v --volumes" -- "$cur" ) )
  465. return
  466. ;;
  467. *)
  468. local force=
  469. for arg in "${COMP_WORDS[@]}"; do
  470. case "$arg" in
  471. -f|--force)
  472. __docker_containers_all
  473. return
  474. ;;
  475. esac
  476. done
  477. __docker_containers_stopped
  478. return
  479. ;;
  480. esac
  481. }
  482. _docker_rmi() {
  483. __docker_image_repos_and_tags_and_ids
  484. }
  485. _docker_run() {
  486. case "$prev" in
  487. -a|--attach)
  488. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  489. return
  490. ;;
  491. --cidfile|--env-file)
  492. _filedir
  493. return
  494. ;;
  495. --volumes-from)
  496. __docker_containers_all
  497. return
  498. ;;
  499. -v|--volume)
  500. case "$cur" in
  501. *:*)
  502. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  503. ;;
  504. '')
  505. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  506. compopt -o nospace
  507. ;;
  508. /*)
  509. _filedir
  510. compopt -o nospace
  511. ;;
  512. esac
  513. return
  514. ;;
  515. -e|--env)
  516. COMPREPLY=( $( compgen -e -- "$cur" ) )
  517. compopt -o nospace
  518. return
  519. ;;
  520. --link)
  521. case "$cur" in
  522. *:*)
  523. ;;
  524. *)
  525. __docker_containers_running
  526. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  527. compopt -o nospace
  528. ;;
  529. esac
  530. return
  531. ;;
  532. --entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|--cpuset|-c|--cpu-shares|-n|--name|-p|--publish|--expose|--dns|--lxc-conf)
  533. return
  534. ;;
  535. *)
  536. ;;
  537. esac
  538. case "$cur" in
  539. -*)
  540. COMPREPLY=( $( compgen -W "--rm -d --detach -n --networking --privileged -P --publish-all -i --interactive -t --tty --cidfile --entrypoint -h --hostname -m --memory -u --user -w --workdir --cpuset -c --cpu-shares --sig-proxy --name -a --attach -v --volume --link -e --env -p --publish --expose --dns --volumes-from --lxc-conf" -- "$cur" ) )
  541. ;;
  542. *)
  543. local counter=$(__docker_pos_first_nonflag '--cidfile|--volumes-from|-v|--volume|-e|--env|--entrypoint|-h|--hostname|-m|--memory|-u|--user|-w|--workdir|--cpuset|-c|--cpu-shares|-n|--name|-a|--attach|--link|-p|--publish|--expose|--dns|--lxc-conf')
  544. if [ $cword -eq $counter ]; then
  545. __docker_image_repos_and_tags_and_ids
  546. fi
  547. ;;
  548. esac
  549. }
  550. _docker_save() {
  551. local counter=$(__docker_pos_first_nonflag)
  552. if [ $cword -eq $counter ]; then
  553. __docker_image_repos_and_tags_and_ids
  554. fi
  555. }
  556. _docker_search() {
  557. case "$prev" in
  558. -s|--stars)
  559. return
  560. ;;
  561. *)
  562. ;;
  563. esac
  564. case "$cur" in
  565. -*)
  566. COMPREPLY=( $( compgen -W "--no-trunc --automated -s --stars" -- "$cur" ) )
  567. ;;
  568. *)
  569. ;;
  570. esac
  571. }
  572. _docker_start() {
  573. case "$cur" in
  574. -*)
  575. COMPREPLY=( $( compgen -W "-a --attach -i --interactive" -- "$cur" ) )
  576. ;;
  577. *)
  578. __docker_containers_stopped
  579. ;;
  580. esac
  581. }
  582. _docker_stop() {
  583. case "$prev" in
  584. -t|--time)
  585. return
  586. ;;
  587. *)
  588. ;;
  589. esac
  590. case "$cur" in
  591. -*)
  592. COMPREPLY=( $( compgen -W "-t --time" -- "$cur" ) )
  593. ;;
  594. *)
  595. __docker_containers_running
  596. ;;
  597. esac
  598. }
  599. _docker_tag() {
  600. case "$cur" in
  601. -*)
  602. COMPREPLY=( $( compgen -W "-f --force" -- "$cur" ) )
  603. ;;
  604. *)
  605. local counter=$(__docker_pos_first_nonflag)
  606. if [ $cword -eq $counter ]; then
  607. __docker_image_repos_and_tags
  608. return
  609. fi
  610. (( counter++ ))
  611. if [ $cword -eq $counter ]; then
  612. __docker_image_repos_and_tags
  613. return
  614. fi
  615. ;;
  616. esac
  617. }
  618. _docker_unpause() {
  619. local counter=$(__docker_pos_first_nonflag)
  620. if [ $cword -eq $counter ]; then
  621. __docker_containers_unpauseable
  622. fi
  623. }
  624. _docker_top() {
  625. local counter=$(__docker_pos_first_nonflag)
  626. if [ $cword -eq $counter ]; then
  627. __docker_containers_running
  628. fi
  629. }
  630. _docker_version() {
  631. return
  632. }
  633. _docker_wait() {
  634. __docker_containers_all
  635. }
  636. _docker() {
  637. local commands=(
  638. attach
  639. build
  640. commit
  641. cp
  642. create
  643. diff
  644. events
  645. exec
  646. export
  647. history
  648. images
  649. import
  650. info
  651. insert
  652. inspect
  653. kill
  654. load
  655. login
  656. logs
  657. pause
  658. port
  659. ps
  660. pull
  661. push
  662. restart
  663. rm
  664. rmi
  665. run
  666. save
  667. search
  668. start
  669. stop
  670. tag
  671. top
  672. unpause
  673. version
  674. wait
  675. )
  676. COMPREPLY=()
  677. local cur prev words cword
  678. _get_comp_words_by_ref -n : cur prev words cword
  679. local command='docker'
  680. local counter=1
  681. while [ $counter -lt $cword ]; do
  682. case "${words[$counter]}" in
  683. -H)
  684. (( counter++ ))
  685. ;;
  686. -*)
  687. ;;
  688. *)
  689. command="${words[$counter]}"
  690. cpos=$counter
  691. (( cpos++ ))
  692. break
  693. ;;
  694. esac
  695. (( counter++ ))
  696. done
  697. local completions_func=_docker_${command}
  698. declare -F $completions_func >/dev/null && $completions_func
  699. return 0
  700. }
  701. complete -F _docker docker