docker 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  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 ${host:+-H "$host"} 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_container_names() {
  55. local containers=( $(__docker_q ps -aq --no-trunc) )
  56. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  57. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  58. COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
  59. }
  60. __docker_container_ids() {
  61. local containers=( $(__docker_q ps -aq) )
  62. COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
  63. }
  64. __docker_image_repos() {
  65. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  66. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  67. }
  68. __docker_image_repos_and_tags() {
  69. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  70. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  71. __ltrim_colon_completions "$cur"
  72. }
  73. __docker_image_repos_and_tags_and_ids() {
  74. local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
  75. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  76. __ltrim_colon_completions "$cur"
  77. }
  78. __docker_containers_and_images() {
  79. __docker_containers_all
  80. local containers=( "${COMPREPLY[@]}" )
  81. __docker_image_repos_and_tags_and_ids
  82. COMPREPLY+=( "${containers[@]}" )
  83. }
  84. # Finds the position of the first word that is neither option nor an option's argument.
  85. # If there are options that require arguments, you should pass a glob describing those
  86. # options, e.g. "--option1|-o|--option2"
  87. # Use this function to restrict completions to exact positions after the argument list.
  88. __docker_pos_first_nonflag() {
  89. local argument_flags=$1
  90. local counter=$((command_pos + 1))
  91. while [ $counter -le $cword ]; do
  92. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  93. (( counter++ ))
  94. # eat "=" in case of --option=arg syntax
  95. [ "${words[$counter]}" = "=" ] && (( counter++ ))
  96. else
  97. case "${words[$counter]}" in
  98. -*)
  99. ;;
  100. *)
  101. break
  102. ;;
  103. esac
  104. fi
  105. # Bash splits words at "=", retaining "=" as a word, examples:
  106. # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
  107. while [ "${words[$counter + 1]}" = "=" ] ; do
  108. counter=$(( counter + 2))
  109. done
  110. (( counter++ ))
  111. done
  112. echo $counter
  113. }
  114. # Returns the value of the first option matching option_glob.
  115. # Valid values for option_glob are option names like '--log-level' and
  116. # globs like '--log-level|-l'
  117. # Only positions between the command and the current word are considered.
  118. __docker_value_of_option() {
  119. local option_glob=$1
  120. local counter=$((command_pos + 1))
  121. while [ $counter -lt $cword ]; do
  122. case ${words[$counter]} in
  123. $option_glob )
  124. echo ${words[$counter + 1]}
  125. break
  126. ;;
  127. esac
  128. (( counter++ ))
  129. done
  130. }
  131. # Transforms a multiline list of strings into a single line string
  132. # with the words separated by "|".
  133. # This is used to prepare arguments to __docker_pos_first_nonflag().
  134. __docker_to_alternatives() {
  135. local parts=( $1 )
  136. local IFS='|'
  137. echo "${parts[*]}"
  138. }
  139. # Transforms a multiline list of options into an extglob pattern
  140. # suitable for use in case statements.
  141. __docker_to_extglob() {
  142. local extglob=$( __docker_to_alternatives "$1" )
  143. echo "@($extglob)"
  144. }
  145. __docker_resolve_hostname() {
  146. command -v host >/dev/null 2>&1 || return
  147. COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
  148. }
  149. __docker_capabilities() {
  150. # The list of capabilities is defined in types.go, ALL was added manually.
  151. COMPREPLY=( $( compgen -W "
  152. ALL
  153. AUDIT_CONTROL
  154. AUDIT_WRITE
  155. AUDIT_READ
  156. BLOCK_SUSPEND
  157. CHOWN
  158. DAC_OVERRIDE
  159. DAC_READ_SEARCH
  160. FOWNER
  161. FSETID
  162. IPC_LOCK
  163. IPC_OWNER
  164. KILL
  165. LEASE
  166. LINUX_IMMUTABLE
  167. MAC_ADMIN
  168. MAC_OVERRIDE
  169. MKNOD
  170. NET_ADMIN
  171. NET_BIND_SERVICE
  172. NET_BROADCAST
  173. NET_RAW
  174. SETFCAP
  175. SETGID
  176. SETPCAP
  177. SETUID
  178. SYS_ADMIN
  179. SYS_BOOT
  180. SYS_CHROOT
  181. SYSLOG
  182. SYS_MODULE
  183. SYS_NICE
  184. SYS_PACCT
  185. SYS_PTRACE
  186. SYS_RAWIO
  187. SYS_RESOURCE
  188. SYS_TIME
  189. SYS_TTY_CONFIG
  190. WAKE_ALARM
  191. " -- "$cur" ) )
  192. }
  193. __docker_log_drivers() {
  194. COMPREPLY=( $( compgen -W "
  195. fluentd
  196. gelf
  197. journald
  198. json-file
  199. none
  200. syslog
  201. " -- "$cur" ) )
  202. }
  203. __docker_log_driver_options() {
  204. # see docs/reference/logging/index.md
  205. local fluentd_options="fluentd-address fluentd-tag"
  206. local gelf_options="gelf-address gelf-tag"
  207. local syslog_options="syslog-address syslog-facility syslog-tag"
  208. case $(__docker_value_of_option --log-driver) in
  209. '')
  210. COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $syslog_options" -S = -- "$cur" ) )
  211. ;;
  212. fluentd)
  213. COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
  214. ;;
  215. gelf)
  216. COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
  217. ;;
  218. syslog)
  219. COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
  220. ;;
  221. *)
  222. return
  223. ;;
  224. esac
  225. compopt -o nospace
  226. }
  227. __docker_complete_log_driver_options() {
  228. # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
  229. # it is the last character or not. So we search for "xxx=" in the the last two words.
  230. case "${words[$cword-2]}$prev=" in
  231. *gelf-address=*)
  232. COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) )
  233. compopt -o nospace
  234. return
  235. ;;
  236. *syslog-address=*)
  237. COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
  238. compopt -o nospace
  239. return
  240. ;;
  241. *syslog-facility=*)
  242. COMPREPLY=( $( compgen -W "
  243. auth
  244. authpriv
  245. cron
  246. daemon
  247. ftp
  248. kern
  249. local0
  250. local1
  251. local2
  252. local3
  253. local4
  254. local5
  255. local6
  256. local7
  257. lpr
  258. mail
  259. news
  260. syslog
  261. user
  262. uucp
  263. " -- "${cur#=}" ) )
  264. return
  265. ;;
  266. esac
  267. return 1
  268. }
  269. # a selection of the available signals that is most likely of interest in the
  270. # context of docker containers.
  271. __docker_signals() {
  272. local signals=(
  273. SIGCONT
  274. SIGHUP
  275. SIGINT
  276. SIGKILL
  277. SIGQUIT
  278. SIGSTOP
  279. SIGTERM
  280. SIGUSR1
  281. SIGUSR2
  282. )
  283. COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  284. }
  285. _docker_docker() {
  286. local boolean_options="
  287. --daemon -d
  288. --debug -D
  289. --help -h
  290. --icc
  291. --ip-forward
  292. --ip-masq
  293. --iptables
  294. --ipv6
  295. --selinux-enabled
  296. --tls
  297. --tlsverify
  298. --userland-proxy=false
  299. --version -v
  300. "
  301. case "$prev" in
  302. --exec-root|--graph|-g)
  303. _filedir -d
  304. return
  305. ;;
  306. --log-driver)
  307. __docker_log_drivers
  308. return
  309. ;;
  310. --log-level|-l)
  311. COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
  312. return
  313. ;;
  314. --log-opt)
  315. __docker_log_driver_options
  316. return
  317. ;;
  318. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  319. _filedir
  320. return
  321. ;;
  322. --storage-driver|-s)
  323. COMPREPLY=( $( compgen -W "aufs devicemapper btrfs overlay" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  324. return
  325. ;;
  326. $main_options_with_args_glob )
  327. return
  328. ;;
  329. esac
  330. __docker_complete_log_driver_options && return
  331. case "$cur" in
  332. -*)
  333. COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
  334. ;;
  335. *)
  336. local counter="$(__docker_pos_first_nonflag $main_options_with_args_glob)"
  337. if [ $cword -eq $counter ]; then
  338. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  339. fi
  340. ;;
  341. esac
  342. }
  343. _docker_attach() {
  344. case "$cur" in
  345. -*)
  346. COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) )
  347. ;;
  348. *)
  349. local counter="$(__docker_pos_first_nonflag)"
  350. if [ $cword -eq $counter ]; then
  351. __docker_containers_running
  352. fi
  353. ;;
  354. esac
  355. }
  356. _docker_build() {
  357. case "$prev" in
  358. --cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap)
  359. return
  360. ;;
  361. --file|-f)
  362. _filedir
  363. return
  364. ;;
  365. --tag|-t)
  366. __docker_image_repos_and_tags
  367. return
  368. ;;
  369. esac
  370. case "$cur" in
  371. -*)
  372. COMPREPLY=( $( compgen -W "--cgroup-parent --cpuset-cpus --cpuset-mems --cpu-shares -c --cpu-period --cpu-quota --file -f --force-rm --help --memory -m --memory-swap --no-cache --pull --quiet -q --rm --tag -t --ulimit" -- "$cur" ) )
  373. ;;
  374. *)
  375. local counter="$(__docker_pos_first_nonflag '--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--file|-f|--memory|-m|--memory-swap|--tag|-t')"
  376. if [ $cword -eq $counter ]; then
  377. _filedir -d
  378. fi
  379. ;;
  380. esac
  381. }
  382. _docker_commit() {
  383. case "$prev" in
  384. --author|-a|--change|-c|--message|-m)
  385. return
  386. ;;
  387. esac
  388. case "$cur" in
  389. -*)
  390. COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
  391. ;;
  392. *)
  393. local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
  394. if [ $cword -eq $counter ]; then
  395. __docker_containers_all
  396. return
  397. fi
  398. (( counter++ ))
  399. if [ $cword -eq $counter ]; then
  400. __docker_image_repos_and_tags
  401. return
  402. fi
  403. ;;
  404. esac
  405. }
  406. _docker_cp() {
  407. case "$cur" in
  408. -*)
  409. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  410. ;;
  411. *)
  412. local counter=$(__docker_pos_first_nonflag)
  413. if [ $cword -eq $counter ]; then
  414. case "$cur" in
  415. *:)
  416. return
  417. ;;
  418. *)
  419. __docker_containers_all
  420. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  421. compopt -o nospace
  422. return
  423. ;;
  424. esac
  425. fi
  426. (( counter++ ))
  427. if [ $cword -eq $counter ]; then
  428. _filedir -d
  429. return
  430. fi
  431. ;;
  432. esac
  433. }
  434. _docker_create() {
  435. _docker_run
  436. }
  437. _docker_diff() {
  438. case "$cur" in
  439. -*)
  440. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  441. ;;
  442. *)
  443. local counter=$(__docker_pos_first_nonflag)
  444. if [ $cword -eq $counter ]; then
  445. __docker_containers_all
  446. fi
  447. ;;
  448. esac
  449. }
  450. _docker_events() {
  451. case "$prev" in
  452. --filter|-f)
  453. COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
  454. compopt -o nospace
  455. return
  456. ;;
  457. --since|--until)
  458. return
  459. ;;
  460. esac
  461. case "${words[$cword-2]}$prev=" in
  462. *container=*)
  463. cur="${cur#=}"
  464. __docker_containers_all
  465. return
  466. ;;
  467. *event=*)
  468. COMPREPLY=( $( compgen -W "
  469. attach
  470. commit
  471. copy
  472. create
  473. delete
  474. destroy
  475. die
  476. exec_create
  477. exec_start
  478. export
  479. import
  480. kill
  481. oom
  482. pause
  483. pull
  484. push
  485. rename
  486. resize
  487. restart
  488. start
  489. stop
  490. tag
  491. top
  492. unpause
  493. untag
  494. " -- "${cur#=}" ) )
  495. return
  496. ;;
  497. *image=*)
  498. cur="${cur#=}"
  499. __docker_image_repos_and_tags_and_ids
  500. return
  501. ;;
  502. esac
  503. case "$cur" in
  504. -*)
  505. COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
  506. ;;
  507. esac
  508. }
  509. _docker_exec() {
  510. case "$prev" in
  511. --user|-u)
  512. return
  513. ;;
  514. esac
  515. case "$cur" in
  516. -*)
  517. COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i -t --tty -u --user" -- "$cur" ) )
  518. ;;
  519. *)
  520. __docker_containers_running
  521. ;;
  522. esac
  523. }
  524. _docker_export() {
  525. case "$cur" in
  526. -*)
  527. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  528. ;;
  529. *)
  530. local counter=$(__docker_pos_first_nonflag)
  531. if [ $cword -eq $counter ]; then
  532. __docker_containers_all
  533. fi
  534. ;;
  535. esac
  536. }
  537. _docker_help() {
  538. local counter=$(__docker_pos_first_nonflag)
  539. if [ $cword -eq $counter ]; then
  540. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  541. fi
  542. }
  543. _docker_history() {
  544. case "$cur" in
  545. -*)
  546. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  547. ;;
  548. *)
  549. local counter=$(__docker_pos_first_nonflag)
  550. if [ $cword -eq $counter ]; then
  551. __docker_image_repos_and_tags_and_ids
  552. fi
  553. ;;
  554. esac
  555. }
  556. _docker_images() {
  557. case "$prev" in
  558. --filter|-f)
  559. COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
  560. if [ "$COMPREPLY" = "label=" ]; then
  561. compopt -o nospace
  562. fi
  563. return
  564. ;;
  565. esac
  566. case "${words[$cword-2]}$prev=" in
  567. *dangling=*)
  568. COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
  569. return
  570. ;;
  571. *label=*)
  572. return
  573. ;;
  574. esac
  575. case "$cur" in
  576. -*)
  577. COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
  578. ;;
  579. =)
  580. return
  581. ;;
  582. *)
  583. __docker_image_repos
  584. ;;
  585. esac
  586. }
  587. _docker_import() {
  588. case "$cur" in
  589. -*)
  590. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  591. ;;
  592. *)
  593. local counter=$(__docker_pos_first_nonflag)
  594. if [ $cword -eq $counter ]; then
  595. return
  596. fi
  597. (( counter++ ))
  598. if [ $cword -eq $counter ]; then
  599. __docker_image_repos_and_tags
  600. return
  601. fi
  602. ;;
  603. esac
  604. }
  605. _docker_info() {
  606. case "$cur" in
  607. -*)
  608. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  609. ;;
  610. esac
  611. }
  612. _docker_inspect() {
  613. case "$prev" in
  614. --format|-f)
  615. return
  616. ;;
  617. --type)
  618. COMPREPLY=( $( compgen -W "image container" -- "$cur" ) )
  619. return
  620. ;;
  621. esac
  622. case "$cur" in
  623. -*)
  624. COMPREPLY=( $( compgen -W "--format -f --type --help" -- "$cur" ) )
  625. ;;
  626. *)
  627. __docker_containers_and_images
  628. ;;
  629. esac
  630. }
  631. _docker_kill() {
  632. case "$prev" in
  633. --signal|-s)
  634. __docker_signals
  635. return
  636. ;;
  637. esac
  638. case "$cur" in
  639. -*)
  640. COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
  641. ;;
  642. *)
  643. __docker_containers_running
  644. ;;
  645. esac
  646. }
  647. _docker_load() {
  648. case "$prev" in
  649. --input|-i)
  650. _filedir
  651. return
  652. ;;
  653. esac
  654. case "$cur" in
  655. -*)
  656. COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
  657. ;;
  658. esac
  659. }
  660. _docker_login() {
  661. case "$prev" in
  662. --email|-e|--password|-p|--username|-u)
  663. return
  664. ;;
  665. esac
  666. case "$cur" in
  667. -*)
  668. COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
  669. ;;
  670. esac
  671. }
  672. _docker_logout() {
  673. case "$cur" in
  674. -*)
  675. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  676. ;;
  677. esac
  678. }
  679. _docker_logs() {
  680. case "$prev" in
  681. --since|--tail)
  682. return
  683. ;;
  684. esac
  685. case "$cur" in
  686. -*)
  687. COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) )
  688. ;;
  689. *)
  690. local counter=$(__docker_pos_first_nonflag '--tail')
  691. if [ $cword -eq $counter ]; then
  692. __docker_containers_all
  693. fi
  694. ;;
  695. esac
  696. }
  697. _docker_pause() {
  698. case "$cur" in
  699. -*)
  700. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  701. ;;
  702. *)
  703. local counter=$(__docker_pos_first_nonflag)
  704. if [ $cword -eq $counter ]; then
  705. __docker_containers_pauseable
  706. fi
  707. ;;
  708. esac
  709. }
  710. _docker_port() {
  711. case "$cur" in
  712. -*)
  713. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  714. ;;
  715. *)
  716. local counter=$(__docker_pos_first_nonflag)
  717. if [ $cword -eq $counter ]; then
  718. __docker_containers_all
  719. fi
  720. ;;
  721. esac
  722. }
  723. _docker_ps() {
  724. case "$prev" in
  725. --before|--since)
  726. __docker_containers_all
  727. ;;
  728. --filter|-f)
  729. COMPREPLY=( $( compgen -S = -W "exited id label name status" -- "$cur" ) )
  730. compopt -o nospace
  731. return
  732. ;;
  733. -n)
  734. return
  735. ;;
  736. esac
  737. case "${words[$cword-2]}$prev=" in
  738. *id=*)
  739. cur="${cur#=}"
  740. __docker_container_ids
  741. return
  742. ;;
  743. *name=*)
  744. cur="${cur#=}"
  745. __docker_container_names
  746. return
  747. ;;
  748. *status=*)
  749. COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
  750. return
  751. ;;
  752. esac
  753. case "$cur" in
  754. -*)
  755. COMPREPLY=( $( compgen -W "--all -a --before --filter -f --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
  756. ;;
  757. esac
  758. }
  759. _docker_pull() {
  760. case "$cur" in
  761. -*)
  762. COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
  763. ;;
  764. *)
  765. local counter=$(__docker_pos_first_nonflag)
  766. if [ $cword -eq $counter ]; then
  767. for arg in "${COMP_WORDS[@]}"; do
  768. case "$arg" in
  769. --all-tags|-a)
  770. __docker_image_repos
  771. return
  772. ;;
  773. esac
  774. done
  775. __docker_image_repos_and_tags
  776. fi
  777. ;;
  778. esac
  779. }
  780. _docker_push() {
  781. case "$cur" in
  782. -*)
  783. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  784. ;;
  785. *)
  786. local counter=$(__docker_pos_first_nonflag)
  787. if [ $cword -eq $counter ]; then
  788. __docker_image_repos_and_tags
  789. fi
  790. ;;
  791. esac
  792. }
  793. _docker_rename() {
  794. case "$cur" in
  795. -*)
  796. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  797. ;;
  798. *)
  799. local counter=$(__docker_pos_first_nonflag)
  800. if [ $cword -eq $counter ]; then
  801. __docker_containers_all
  802. fi
  803. ;;
  804. esac
  805. }
  806. _docker_restart() {
  807. case "$prev" in
  808. --time|-t)
  809. return
  810. ;;
  811. esac
  812. case "$cur" in
  813. -*)
  814. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  815. ;;
  816. *)
  817. __docker_containers_all
  818. ;;
  819. esac
  820. }
  821. _docker_rm() {
  822. case "$cur" in
  823. -*)
  824. COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
  825. ;;
  826. *)
  827. for arg in "${COMP_WORDS[@]}"; do
  828. case "$arg" in
  829. --force|-f)
  830. __docker_containers_all
  831. return
  832. ;;
  833. esac
  834. done
  835. __docker_containers_stopped
  836. ;;
  837. esac
  838. }
  839. _docker_rmi() {
  840. case "$cur" in
  841. -*)
  842. COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
  843. ;;
  844. *)
  845. __docker_image_repos_and_tags_and_ids
  846. ;;
  847. esac
  848. }
  849. _docker_run() {
  850. local options_with_args="
  851. --add-host
  852. --blkio-weight
  853. --attach -a
  854. --cap-add
  855. --cap-drop
  856. --cgroup-parent
  857. --cidfile
  858. --cpuset
  859. --cpu-period
  860. --cpu-quota
  861. --cpu-shares -c
  862. --device
  863. --dns
  864. --dns-search
  865. --entrypoint
  866. --env -e
  867. --env-file
  868. --expose
  869. --group-add
  870. --hostname -h
  871. --ipc
  872. --label -l
  873. --label-file
  874. --link
  875. --log-driver
  876. --log-opt
  877. --lxc-conf
  878. --mac-address
  879. --memory -m
  880. --memory-swap
  881. --name
  882. --net
  883. --pid
  884. --publish -p
  885. --restart
  886. --security-opt
  887. --user -u
  888. --ulimit
  889. --uts
  890. --volumes-from
  891. --volume -v
  892. --workdir -w
  893. "
  894. local all_options="$options_with_args
  895. --help
  896. --interactive -i
  897. --privileged
  898. --publish-all -P
  899. --read-only
  900. --tty -t
  901. "
  902. [ "$command" = "run" ] && all_options="$all_options
  903. --detach -d
  904. --rm
  905. --sig-proxy
  906. "
  907. local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
  908. case "$prev" in
  909. --add-host)
  910. case "$cur" in
  911. *:)
  912. __docker_resolve_hostname
  913. return
  914. ;;
  915. esac
  916. ;;
  917. --attach|-a)
  918. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  919. return
  920. ;;
  921. --cap-add|--cap-drop)
  922. __docker_capabilities
  923. return
  924. ;;
  925. --cidfile|--env-file|--label-file)
  926. _filedir
  927. return
  928. ;;
  929. --device|--volume|-v)
  930. case "$cur" in
  931. *:*)
  932. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  933. ;;
  934. '')
  935. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  936. compopt -o nospace
  937. ;;
  938. /*)
  939. _filedir
  940. compopt -o nospace
  941. ;;
  942. esac
  943. return
  944. ;;
  945. --env|-e)
  946. COMPREPLY=( $( compgen -e -- "$cur" ) )
  947. compopt -o nospace
  948. return
  949. ;;
  950. --ipc)
  951. case "$cur" in
  952. *:*)
  953. cur="${cur#*:}"
  954. __docker_containers_running
  955. ;;
  956. *)
  957. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  958. if [ "$COMPREPLY" = "container:" ]; then
  959. compopt -o nospace
  960. fi
  961. ;;
  962. esac
  963. return
  964. ;;
  965. --link)
  966. case "$cur" in
  967. *:*)
  968. ;;
  969. *)
  970. __docker_containers_running
  971. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  972. compopt -o nospace
  973. ;;
  974. esac
  975. return
  976. ;;
  977. --log-driver)
  978. __docker_log_drivers
  979. return
  980. ;;
  981. --log-opt)
  982. __docker_log_driver_options
  983. return
  984. ;;
  985. --net)
  986. case "$cur" in
  987. container:*)
  988. local cur=${cur#*:}
  989. __docker_containers_all
  990. ;;
  991. *)
  992. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  993. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  994. compopt -o nospace
  995. fi
  996. ;;
  997. esac
  998. return
  999. ;;
  1000. --restart)
  1001. case "$cur" in
  1002. on-failure:*)
  1003. ;;
  1004. *)
  1005. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  1006. ;;
  1007. esac
  1008. return
  1009. ;;
  1010. --security-opt)
  1011. case "$cur" in
  1012. label:*:*)
  1013. ;;
  1014. label:*)
  1015. local cur=${cur##*:}
  1016. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  1017. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  1018. compopt -o nospace
  1019. fi
  1020. ;;
  1021. *)
  1022. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  1023. compopt -o nospace
  1024. ;;
  1025. esac
  1026. return
  1027. ;;
  1028. --volumes-from)
  1029. __docker_containers_all
  1030. return
  1031. ;;
  1032. $options_with_args_glob )
  1033. return
  1034. ;;
  1035. esac
  1036. __docker_complete_log_driver_options && return
  1037. case "$cur" in
  1038. -*)
  1039. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  1040. ;;
  1041. *)
  1042. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  1043. if [ $cword -eq $counter ]; then
  1044. __docker_image_repos_and_tags_and_ids
  1045. fi
  1046. ;;
  1047. esac
  1048. }
  1049. _docker_save() {
  1050. case "$prev" in
  1051. --output|-o)
  1052. _filedir
  1053. return
  1054. ;;
  1055. esac
  1056. case "$cur" in
  1057. -*)
  1058. COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
  1059. ;;
  1060. *)
  1061. __docker_image_repos_and_tags_and_ids
  1062. ;;
  1063. esac
  1064. }
  1065. _docker_search() {
  1066. case "$prev" in
  1067. --stars|-s)
  1068. return
  1069. ;;
  1070. esac
  1071. case "$cur" in
  1072. -*)
  1073. COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
  1074. ;;
  1075. esac
  1076. }
  1077. _docker_start() {
  1078. case "$cur" in
  1079. -*)
  1080. COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
  1081. ;;
  1082. *)
  1083. __docker_containers_stopped
  1084. ;;
  1085. esac
  1086. }
  1087. _docker_stats() {
  1088. case "$cur" in
  1089. -*)
  1090. COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) )
  1091. ;;
  1092. *)
  1093. __docker_containers_running
  1094. ;;
  1095. esac
  1096. }
  1097. _docker_stop() {
  1098. case "$prev" in
  1099. --time|-t)
  1100. return
  1101. ;;
  1102. esac
  1103. case "$cur" in
  1104. -*)
  1105. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1106. ;;
  1107. *)
  1108. __docker_containers_running
  1109. ;;
  1110. esac
  1111. }
  1112. _docker_tag() {
  1113. case "$cur" in
  1114. -*)
  1115. COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
  1116. ;;
  1117. *)
  1118. local counter=$(__docker_pos_first_nonflag)
  1119. if [ $cword -eq $counter ]; then
  1120. __docker_image_repos_and_tags
  1121. return
  1122. fi
  1123. (( counter++ ))
  1124. if [ $cword -eq $counter ]; then
  1125. __docker_image_repos_and_tags
  1126. return
  1127. fi
  1128. ;;
  1129. esac
  1130. }
  1131. _docker_unpause() {
  1132. case "$cur" in
  1133. -*)
  1134. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1135. ;;
  1136. *)
  1137. local counter=$(__docker_pos_first_nonflag)
  1138. if [ $cword -eq $counter ]; then
  1139. __docker_containers_unpauseable
  1140. fi
  1141. ;;
  1142. esac
  1143. }
  1144. _docker_top() {
  1145. case "$cur" in
  1146. -*)
  1147. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1148. ;;
  1149. *)
  1150. local counter=$(__docker_pos_first_nonflag)
  1151. if [ $cword -eq $counter ]; then
  1152. __docker_containers_running
  1153. fi
  1154. ;;
  1155. esac
  1156. }
  1157. _docker_version() {
  1158. case "$cur" in
  1159. -*)
  1160. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1161. ;;
  1162. esac
  1163. }
  1164. _docker_wait() {
  1165. case "$cur" in
  1166. -*)
  1167. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1168. ;;
  1169. *)
  1170. __docker_containers_all
  1171. ;;
  1172. esac
  1173. }
  1174. _docker() {
  1175. local previous_extglob_setting=$(shopt -p extglob)
  1176. shopt -s extglob
  1177. local commands=(
  1178. attach
  1179. build
  1180. commit
  1181. cp
  1182. create
  1183. diff
  1184. events
  1185. exec
  1186. export
  1187. history
  1188. images
  1189. import
  1190. info
  1191. inspect
  1192. kill
  1193. load
  1194. login
  1195. logout
  1196. logs
  1197. pause
  1198. port
  1199. ps
  1200. pull
  1201. push
  1202. rename
  1203. restart
  1204. rm
  1205. rmi
  1206. run
  1207. save
  1208. search
  1209. start
  1210. stats
  1211. stop
  1212. tag
  1213. top
  1214. unpause
  1215. version
  1216. wait
  1217. )
  1218. local main_options_with_args="
  1219. --api-cors-header
  1220. --bip
  1221. --bridge -b
  1222. --default-gateway
  1223. --default-gateway-v6
  1224. --default-ulimit
  1225. --dns
  1226. --dns-search
  1227. --exec-driver -e
  1228. --exec-opt
  1229. --exec-root
  1230. --fixed-cidr
  1231. --fixed-cidr-v6
  1232. --graph -g
  1233. --group -G
  1234. --host -H
  1235. --insecure-registry
  1236. --ip
  1237. --label
  1238. --log-driver
  1239. --log-level -l
  1240. --log-opt
  1241. --mtu
  1242. --pidfile -p
  1243. --registry-mirror
  1244. --storage-driver -s
  1245. --storage-opt
  1246. --tlscacert
  1247. --tlscert
  1248. --tlskey
  1249. "
  1250. local main_options_with_args_glob=$(__docker_to_extglob "$main_options_with_args")
  1251. local host
  1252. COMPREPLY=()
  1253. local cur prev words cword
  1254. _get_comp_words_by_ref -n : cur prev words cword
  1255. local command='docker' command_pos=0
  1256. local counter=1
  1257. while [ $counter -lt $cword ]; do
  1258. case "${words[$counter]}" in
  1259. # save host so that completion can use custom daemon
  1260. --host|-H)
  1261. (( counter++ ))
  1262. host="${words[$counter]}"
  1263. ;;
  1264. $main_options_with_args_glob )
  1265. (( counter++ ))
  1266. ;;
  1267. -*)
  1268. ;;
  1269. =)
  1270. (( counter++ ))
  1271. ;;
  1272. *)
  1273. command="${words[$counter]}"
  1274. command_pos=$counter
  1275. break
  1276. ;;
  1277. esac
  1278. (( counter++ ))
  1279. done
  1280. local completions_func=_docker_${command}
  1281. declare -F $completions_func >/dev/null && $completions_func
  1282. eval "$previous_extglob_setting"
  1283. return 0
  1284. }
  1285. complete -F _docker docker