docker 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  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. # Configuration:
  19. #
  20. # You can tailor completion for the "events", "history", "inspect", "run",
  21. # "rmi" and "save" commands by settings the following environment
  22. # variables:
  23. #
  24. # DOCKER_COMPLETION_SHOW_IMAGE_IDS
  25. # "none" - Show names only (default)
  26. # "non-intermediate" - Show names and ids, but omit intermediate image IDs
  27. # "all" - Show names and ids, including intermediate image IDs
  28. #
  29. # DOCKER_COMPLETION_SHOW_TAGS
  30. # "yes" - include tags in completion options (default)
  31. # "no" - don't include tags in completion options
  32. #
  33. # Note:
  34. # Currently, the completions will not work if the docker daemon is not
  35. # bound to the default communication port/socket
  36. # If the docker daemon is using a unix socket for communication your user
  37. # must have access to the socket for the completions to function correctly
  38. #
  39. # Note for developers:
  40. # Please arrange options sorted alphabetically by long name with the short
  41. # options immediately following their corresponding long form.
  42. # This order should be applied to lists, alternatives and code blocks.
  43. __docker_q() {
  44. docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@"
  45. }
  46. __docker_containers_all() {
  47. local IFS=$'\n'
  48. local containers=( $(__docker_q ps -aq --no-trunc) )
  49. if [ "$1" ]; then
  50. containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
  51. fi
  52. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  53. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  54. unset IFS
  55. COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
  56. }
  57. __docker_containers_running() {
  58. __docker_containers_all '.State.Running'
  59. }
  60. __docker_containers_stopped() {
  61. __docker_containers_all 'not .State.Running'
  62. }
  63. __docker_containers_pauseable() {
  64. __docker_containers_all 'and .State.Running (not .State.Paused)'
  65. }
  66. __docker_containers_unpauseable() {
  67. __docker_containers_all '.State.Paused'
  68. }
  69. __docker_container_names() {
  70. local containers=( $(__docker_q ps -aq --no-trunc) )
  71. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  72. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  73. COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
  74. }
  75. __docker_container_ids() {
  76. local containers=( $(__docker_q ps -aq) )
  77. COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
  78. }
  79. __docker_images() {
  80. local images_args=""
  81. case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
  82. all)
  83. images_args="--no-trunc -a"
  84. ;;
  85. non-intermediate)
  86. images_args="--no-trunc"
  87. ;;
  88. esac
  89. local repo_print_command
  90. if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
  91. repo_print_command='print $1; print $1":"$2'
  92. else
  93. repo_print_command='print $1'
  94. fi
  95. local awk_script
  96. case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in
  97. all|non-intermediate)
  98. awk_script='NR>1 { print $3; if ($1 != "<none>") { '"$repo_print_command"' } }'
  99. ;;
  100. none|*)
  101. awk_script='NR>1 && $1 != "<none>" { '"$repo_print_command"' }'
  102. ;;
  103. esac
  104. local images=$(__docker_q images $images_args | awk "$awk_script")
  105. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  106. __ltrim_colon_completions "$cur"
  107. }
  108. __docker_image_repos() {
  109. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  110. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  111. }
  112. __docker_image_repos_and_tags() {
  113. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  114. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  115. __ltrim_colon_completions "$cur"
  116. }
  117. __docker_containers_and_images() {
  118. __docker_containers_all
  119. local containers=( "${COMPREPLY[@]}" )
  120. __docker_images
  121. COMPREPLY+=( "${containers[@]}" )
  122. }
  123. __docker_networks() {
  124. COMPREPLY=( $(compgen -W "$(__docker_q network ls | awk 'NR>1 {print $2}')" -- "$cur") )
  125. }
  126. __docker_volumes() {
  127. COMPREPLY=( $(compgen -W "$(__docker_q volume ls -q)" -- "$cur") )
  128. }
  129. # Finds the position of the first word that is neither option nor an option's argument.
  130. # If there are options that require arguments, you should pass a glob describing those
  131. # options, e.g. "--option1|-o|--option2"
  132. # Use this function to restrict completions to exact positions after the argument list.
  133. __docker_pos_first_nonflag() {
  134. local argument_flags=$1
  135. local counter=$((${subcommand_pos:-${command_pos}} + 1))
  136. while [ $counter -le $cword ]; do
  137. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  138. (( counter++ ))
  139. # eat "=" in case of --option=arg syntax
  140. [ "${words[$counter]}" = "=" ] && (( counter++ ))
  141. else
  142. case "${words[$counter]}" in
  143. -*)
  144. ;;
  145. *)
  146. break
  147. ;;
  148. esac
  149. fi
  150. # Bash splits words at "=", retaining "=" as a word, examples:
  151. # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
  152. while [ "${words[$counter + 1]}" = "=" ] ; do
  153. counter=$(( counter + 2))
  154. done
  155. (( counter++ ))
  156. done
  157. echo $counter
  158. }
  159. # Returns the value of the first option matching option_glob.
  160. # Valid values for option_glob are option names like '--log-level' and
  161. # globs like '--log-level|-l'
  162. # Only positions between the command and the current word are considered.
  163. __docker_value_of_option() {
  164. local option_extglob=$(__docker_to_extglob "$1")
  165. local counter=$((command_pos + 1))
  166. while [ $counter -lt $cword ]; do
  167. case ${words[$counter]} in
  168. $option_extglob )
  169. echo ${words[$counter + 1]}
  170. break
  171. ;;
  172. esac
  173. (( counter++ ))
  174. done
  175. }
  176. # Transforms a multiline list of strings into a single line string
  177. # with the words separated by "|".
  178. # This is used to prepare arguments to __docker_pos_first_nonflag().
  179. __docker_to_alternatives() {
  180. local parts=( $1 )
  181. local IFS='|'
  182. echo "${parts[*]}"
  183. }
  184. # Transforms a multiline list of options into an extglob pattern
  185. # suitable for use in case statements.
  186. __docker_to_extglob() {
  187. local extglob=$( __docker_to_alternatives "$1" )
  188. echo "@($extglob)"
  189. }
  190. # Subcommand processing.
  191. # Locates the first occurrence of any of the subcommands contained in the
  192. # first argument. In case of a match, calls the corresponding completion
  193. # function and returns 0.
  194. # If no match is found, 1 is returned. The calling function can then
  195. # continue processing its completion.
  196. #
  197. # TODO if the preceding command has options that accept arguments and an
  198. # argument is equal ot one of the subcommands, this is falsely detected as
  199. # a match.
  200. __docker_subcommands() {
  201. local subcommands="$1"
  202. local counter=$(($command_pos + 1))
  203. while [ $counter -lt $cword ]; do
  204. case "${words[$counter]}" in
  205. $(__docker_to_extglob "$subcommands") )
  206. subcommand_pos=$counter
  207. local subcommand=${words[$counter]}
  208. local completions_func=_docker_${command}_${subcommand}
  209. declare -F $completions_func >/dev/null && $completions_func
  210. return 0
  211. ;;
  212. esac
  213. (( counter++ ))
  214. done
  215. return 1
  216. }
  217. # suppress trailing whitespace
  218. __docker_nospace() {
  219. # compopt is not available in ancient bash versions
  220. type compopt &>/dev/null && compopt -o nospace
  221. }
  222. __docker_resolve_hostname() {
  223. command -v host >/dev/null 2>&1 || return
  224. COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
  225. }
  226. __docker_capabilities() {
  227. # The list of capabilities is defined in types.go, ALL was added manually.
  228. COMPREPLY=( $( compgen -W "
  229. ALL
  230. AUDIT_CONTROL
  231. AUDIT_WRITE
  232. AUDIT_READ
  233. BLOCK_SUSPEND
  234. CHOWN
  235. DAC_OVERRIDE
  236. DAC_READ_SEARCH
  237. FOWNER
  238. FSETID
  239. IPC_LOCK
  240. IPC_OWNER
  241. KILL
  242. LEASE
  243. LINUX_IMMUTABLE
  244. MAC_ADMIN
  245. MAC_OVERRIDE
  246. MKNOD
  247. NET_ADMIN
  248. NET_BIND_SERVICE
  249. NET_BROADCAST
  250. NET_RAW
  251. SETFCAP
  252. SETGID
  253. SETPCAP
  254. SETUID
  255. SYS_ADMIN
  256. SYS_BOOT
  257. SYS_CHROOT
  258. SYSLOG
  259. SYS_MODULE
  260. SYS_NICE
  261. SYS_PACCT
  262. SYS_PTRACE
  263. SYS_RAWIO
  264. SYS_RESOURCE
  265. SYS_TIME
  266. SYS_TTY_CONFIG
  267. WAKE_ALARM
  268. " -- "$cur" ) )
  269. }
  270. __docker_log_drivers() {
  271. COMPREPLY=( $( compgen -W "
  272. fluentd
  273. gelf
  274. journald
  275. json-file
  276. none
  277. syslog
  278. " -- "$cur" ) )
  279. }
  280. __docker_log_driver_options() {
  281. # see docs/reference/logging/index.md
  282. local fluentd_options="fluentd-address tag"
  283. local gelf_options="gelf-address tag"
  284. local json_file_options="max-file max-size"
  285. local syslog_options="syslog-address syslog-facility tag"
  286. local awslogs_options="awslogs-region awslogs-group awslogs-stream"
  287. case $(__docker_value_of_option --log-driver) in
  288. '')
  289. COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $json_file_options $syslog_options" -S = -- "$cur" ) )
  290. ;;
  291. fluentd)
  292. COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
  293. ;;
  294. gelf)
  295. COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
  296. ;;
  297. json-file)
  298. COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
  299. ;;
  300. syslog)
  301. COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
  302. ;;
  303. awslogs)
  304. COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
  305. ;;
  306. *)
  307. return
  308. ;;
  309. esac
  310. __docker_nospace
  311. }
  312. __docker_complete_log_driver_options() {
  313. # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
  314. # it is the last character or not. So we search for "xxx=" in the the last two words.
  315. case "${words[$cword-2]}$prev=" in
  316. *gelf-address=*)
  317. COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) )
  318. __docker_nospace
  319. return
  320. ;;
  321. *syslog-address=*)
  322. COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
  323. __docker_nospace
  324. return
  325. ;;
  326. *syslog-facility=*)
  327. COMPREPLY=( $( compgen -W "
  328. auth
  329. authpriv
  330. cron
  331. daemon
  332. ftp
  333. kern
  334. local0
  335. local1
  336. local2
  337. local3
  338. local4
  339. local5
  340. local6
  341. local7
  342. lpr
  343. mail
  344. news
  345. syslog
  346. user
  347. uucp
  348. " -- "${cur#=}" ) )
  349. return
  350. ;;
  351. esac
  352. return 1
  353. }
  354. __docker_log_levels() {
  355. COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
  356. }
  357. # a selection of the available signals that is most likely of interest in the
  358. # context of docker containers.
  359. __docker_signals() {
  360. local signals=(
  361. SIGCONT
  362. SIGHUP
  363. SIGINT
  364. SIGKILL
  365. SIGQUIT
  366. SIGSTOP
  367. SIGTERM
  368. SIGUSR1
  369. SIGUSR2
  370. )
  371. COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  372. }
  373. # global options that may appear after the docker command
  374. _docker_docker() {
  375. local boolean_options="
  376. $global_boolean_options
  377. --help
  378. --version -v
  379. "
  380. case "$prev" in
  381. --config)
  382. _filedir -d
  383. return
  384. ;;
  385. --log-level|-l)
  386. __docker_log_levels
  387. return
  388. ;;
  389. $(__docker_to_extglob "$global_options_with_args") )
  390. return
  391. ;;
  392. esac
  393. case "$cur" in
  394. -*)
  395. COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
  396. ;;
  397. *)
  398. local counter=$( __docker_pos_first_nonflag $(__docker_to_extglob "$global_options_with_args") )
  399. if [ $cword -eq $counter ]; then
  400. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  401. fi
  402. ;;
  403. esac
  404. }
  405. _docker_attach() {
  406. case "$cur" in
  407. -*)
  408. COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) )
  409. ;;
  410. *)
  411. local counter="$(__docker_pos_first_nonflag)"
  412. if [ $cword -eq $counter ]; then
  413. __docker_containers_running
  414. fi
  415. ;;
  416. esac
  417. }
  418. _docker_build() {
  419. case "$prev" in
  420. --cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap)
  421. return
  422. ;;
  423. --file|-f)
  424. _filedir
  425. return
  426. ;;
  427. --tag|-t)
  428. __docker_image_repos_and_tags
  429. return
  430. ;;
  431. esac
  432. case "$cur" in
  433. -*)
  434. 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" ) )
  435. ;;
  436. *)
  437. 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')"
  438. if [ $cword -eq $counter ]; then
  439. _filedir -d
  440. fi
  441. ;;
  442. esac
  443. }
  444. _docker_commit() {
  445. case "$prev" in
  446. --author|-a|--change|-c|--message|-m)
  447. return
  448. ;;
  449. esac
  450. case "$cur" in
  451. -*)
  452. COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
  453. ;;
  454. *)
  455. local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
  456. if [ $cword -eq $counter ]; then
  457. __docker_containers_all
  458. return
  459. fi
  460. (( counter++ ))
  461. if [ $cword -eq $counter ]; then
  462. __docker_image_repos_and_tags
  463. return
  464. fi
  465. ;;
  466. esac
  467. }
  468. _docker_cp() {
  469. case "$cur" in
  470. -*)
  471. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  472. ;;
  473. *)
  474. local counter=$(__docker_pos_first_nonflag)
  475. if [ $cword -eq $counter ]; then
  476. case "$cur" in
  477. *:)
  478. return
  479. ;;
  480. *)
  481. __docker_containers_all
  482. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  483. __docker_nospace
  484. return
  485. ;;
  486. esac
  487. fi
  488. (( counter++ ))
  489. if [ $cword -eq $counter ]; then
  490. _filedir -d
  491. return
  492. fi
  493. ;;
  494. esac
  495. }
  496. _docker_create() {
  497. _docker_run
  498. }
  499. _docker_daemon() {
  500. local boolean_options="
  501. $global_boolean_options
  502. --disable-legacy-registry
  503. --help
  504. --icc=false
  505. --ip-forward=false
  506. --ip-masq=false
  507. --iptables=false
  508. --ipv6
  509. --selinux-enabled
  510. --userland-proxy=false
  511. "
  512. local options_with_args="
  513. $global_options_with_args
  514. --api-cors-header
  515. --bip
  516. --bridge -b
  517. --cluster-advertise
  518. --cluster-store
  519. --cluster-store-opt
  520. --default-gateway
  521. --default-gateway-v6
  522. --default-ulimit
  523. --dns
  524. --dns-search
  525. --dns-opt
  526. --exec-driver -e
  527. --exec-opt
  528. --exec-root
  529. --fixed-cidr
  530. --fixed-cidr-v6
  531. --graph -g
  532. --group -G
  533. --insecure-registry
  534. --ip
  535. --label
  536. --log-driver
  537. --log-opt
  538. --mtu
  539. --pidfile -p
  540. --registry-mirror
  541. --storage-driver -s
  542. --storage-opt
  543. "
  544. case "$prev" in
  545. --cluster-store)
  546. COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
  547. __docker_nospace
  548. return
  549. ;;
  550. --cluster-store-opt)
  551. COMPREPLY=( $( compgen -W "kv.cacertfile kv.certfile kv.keyfile" -S = -- "$cur" ) )
  552. __docker_nospace
  553. return
  554. ;;
  555. --exec-root|--graph|-g)
  556. _filedir -d
  557. return
  558. ;;
  559. --log-driver)
  560. __docker_log_drivers
  561. return
  562. ;;
  563. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  564. _filedir
  565. return
  566. ;;
  567. --storage-driver|-s)
  568. COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  569. return
  570. ;;
  571. --storage-opt)
  572. local devicemapper_options="
  573. dm.basesize
  574. dm.blkdiscard
  575. dm.blocksize
  576. dm.fs
  577. dm.loopdatasize
  578. dm.loopmetadatasize
  579. dm.mkfsarg
  580. dm.mountopt
  581. dm.override_udev_sync_check
  582. dm.thinpooldev
  583. "
  584. local zfs_options="zfs.fsname"
  585. case $(__docker_value_of_option '--storage-driver|-s') in
  586. '')
  587. COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) )
  588. ;;
  589. devicemapper)
  590. COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) )
  591. ;;
  592. zfs)
  593. COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
  594. ;;
  595. *)
  596. return
  597. ;;
  598. esac
  599. __docker_nospace
  600. return
  601. ;;
  602. --log-level|-l)
  603. __docker_log_levels
  604. return
  605. ;;
  606. --log-opt)
  607. __docker_log_driver_options
  608. return
  609. ;;
  610. $(__docker_to_extglob "$options_with_args") )
  611. return
  612. ;;
  613. esac
  614. __docker_complete_log_driver_options && return
  615. case "${words[$cword-2]}$prev=" in
  616. # completions for --storage-opt
  617. *dm.blkdiscard=*)
  618. COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
  619. return
  620. ;;
  621. *dm.fs=*)
  622. COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) )
  623. return
  624. ;;
  625. *dm.override_udev_sync_check=*)
  626. COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
  627. return
  628. ;;
  629. *dm.thinpooldev=*)
  630. _filedir
  631. return
  632. ;;
  633. # completions for --cluster-store-opt
  634. *kv.*file=*)
  635. _filedir
  636. return
  637. ;;
  638. esac
  639. case "$cur" in
  640. -*)
  641. COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
  642. ;;
  643. esac
  644. }
  645. _docker_diff() {
  646. case "$cur" in
  647. -*)
  648. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  649. ;;
  650. *)
  651. local counter=$(__docker_pos_first_nonflag)
  652. if [ $cword -eq $counter ]; then
  653. __docker_containers_all
  654. fi
  655. ;;
  656. esac
  657. }
  658. _docker_events() {
  659. case "$prev" in
  660. --filter|-f)
  661. COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
  662. __docker_nospace
  663. return
  664. ;;
  665. --since|--until)
  666. return
  667. ;;
  668. esac
  669. case "${words[$cword-2]}$prev=" in
  670. *container=*)
  671. cur="${cur#=}"
  672. __docker_containers_all
  673. return
  674. ;;
  675. *event=*)
  676. COMPREPLY=( $( compgen -W "
  677. attach
  678. commit
  679. copy
  680. create
  681. delete
  682. destroy
  683. die
  684. exec_create
  685. exec_start
  686. export
  687. import
  688. kill
  689. oom
  690. pause
  691. pull
  692. push
  693. rename
  694. resize
  695. restart
  696. start
  697. stop
  698. tag
  699. top
  700. unpause
  701. untag
  702. " -- "${cur#=}" ) )
  703. return
  704. ;;
  705. *image=*)
  706. cur="${cur#=}"
  707. __docker_images
  708. return
  709. ;;
  710. esac
  711. case "$cur" in
  712. -*)
  713. COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
  714. ;;
  715. esac
  716. }
  717. _docker_exec() {
  718. case "$prev" in
  719. --user|-u)
  720. return
  721. ;;
  722. esac
  723. case "$cur" in
  724. -*)
  725. COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) )
  726. ;;
  727. *)
  728. __docker_containers_running
  729. ;;
  730. esac
  731. }
  732. _docker_export() {
  733. case "$cur" in
  734. -*)
  735. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  736. ;;
  737. *)
  738. local counter=$(__docker_pos_first_nonflag)
  739. if [ $cword -eq $counter ]; then
  740. __docker_containers_all
  741. fi
  742. ;;
  743. esac
  744. }
  745. _docker_help() {
  746. local counter=$(__docker_pos_first_nonflag)
  747. if [ $cword -eq $counter ]; then
  748. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  749. fi
  750. }
  751. _docker_history() {
  752. case "$cur" in
  753. -*)
  754. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  755. ;;
  756. *)
  757. local counter=$(__docker_pos_first_nonflag)
  758. if [ $cword -eq $counter ]; then
  759. __docker_images
  760. fi
  761. ;;
  762. esac
  763. }
  764. _docker_images() {
  765. case "$prev" in
  766. --filter|-f)
  767. COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
  768. if [ "$COMPREPLY" = "label=" ]; then
  769. __docker_nospace
  770. fi
  771. return
  772. ;;
  773. esac
  774. case "${words[$cword-2]}$prev=" in
  775. *dangling=*)
  776. COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
  777. return
  778. ;;
  779. *label=*)
  780. return
  781. ;;
  782. esac
  783. case "$cur" in
  784. -*)
  785. COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
  786. ;;
  787. =)
  788. return
  789. ;;
  790. *)
  791. __docker_image_repos
  792. ;;
  793. esac
  794. }
  795. _docker_import() {
  796. case "$cur" in
  797. -*)
  798. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  799. ;;
  800. *)
  801. local counter=$(__docker_pos_first_nonflag)
  802. if [ $cword -eq $counter ]; then
  803. return
  804. fi
  805. (( counter++ ))
  806. if [ $cword -eq $counter ]; then
  807. __docker_image_repos_and_tags
  808. return
  809. fi
  810. ;;
  811. esac
  812. }
  813. _docker_info() {
  814. case "$cur" in
  815. -*)
  816. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  817. ;;
  818. esac
  819. }
  820. _docker_inspect() {
  821. case "$prev" in
  822. --format|-f)
  823. return
  824. ;;
  825. --type)
  826. COMPREPLY=( $( compgen -W "image container" -- "$cur" ) )
  827. return
  828. ;;
  829. esac
  830. case "$cur" in
  831. -*)
  832. COMPREPLY=( $( compgen -W "--format -f --help --size -s --type" -- "$cur" ) )
  833. ;;
  834. *)
  835. case $(__docker_value_of_option --type) in
  836. '')
  837. __docker_containers_and_images
  838. ;;
  839. container)
  840. __docker_containers_all
  841. ;;
  842. image)
  843. __docker_images
  844. ;;
  845. esac
  846. esac
  847. }
  848. _docker_kill() {
  849. case "$prev" in
  850. --signal|-s)
  851. __docker_signals
  852. return
  853. ;;
  854. esac
  855. case "$cur" in
  856. -*)
  857. COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
  858. ;;
  859. *)
  860. __docker_containers_running
  861. ;;
  862. esac
  863. }
  864. _docker_load() {
  865. case "$prev" in
  866. --input|-i)
  867. _filedir
  868. return
  869. ;;
  870. esac
  871. case "$cur" in
  872. -*)
  873. COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
  874. ;;
  875. esac
  876. }
  877. _docker_login() {
  878. case "$prev" in
  879. --email|-e|--password|-p|--username|-u)
  880. return
  881. ;;
  882. esac
  883. case "$cur" in
  884. -*)
  885. COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
  886. ;;
  887. esac
  888. }
  889. _docker_logout() {
  890. case "$cur" in
  891. -*)
  892. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  893. ;;
  894. esac
  895. }
  896. _docker_logs() {
  897. case "$prev" in
  898. --since|--tail)
  899. return
  900. ;;
  901. esac
  902. case "$cur" in
  903. -*)
  904. COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) )
  905. ;;
  906. *)
  907. local counter=$(__docker_pos_first_nonflag '--tail')
  908. if [ $cword -eq $counter ]; then
  909. __docker_containers_all
  910. fi
  911. ;;
  912. esac
  913. }
  914. _docker_network_connect() {
  915. case "$cur" in
  916. -*)
  917. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  918. ;;
  919. *)
  920. local counter=$(__docker_pos_first_nonflag '--tail')
  921. if [ $cword -eq $counter ]; then
  922. __docker_networks
  923. elif [ $cword -eq $(($counter + 1)) ]; then
  924. __docker_containers_running
  925. fi
  926. ;;
  927. esac
  928. }
  929. _docker_network_create() {
  930. case "$prev" in
  931. --driver|-d)
  932. # no need to suggest drivers that allow one instance only
  933. # (host, null)
  934. COMPREPLY=( $( compgen -W "bridge overlay" -- "$cur" ) )
  935. return
  936. ;;
  937. esac
  938. case "$cur" in
  939. -*)
  940. COMPREPLY=( $( compgen -W "--driver -d --help" -- "$cur" ) )
  941. ;;
  942. esac
  943. }
  944. _docker_network_disconnect() {
  945. # TODO disconnect should only complete running containers connected
  946. # to the specified network.
  947. _docker_network_connect
  948. }
  949. _docker_network_inspect() {
  950. case "$cur" in
  951. -*)
  952. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  953. ;;
  954. *)
  955. local counter=$(__docker_pos_first_nonflag)
  956. if [ $cword -eq $counter ]; then
  957. __docker_networks
  958. fi
  959. ;;
  960. esac
  961. }
  962. _docker_network_ls() {
  963. case "$prev" in
  964. -n)
  965. return
  966. ;;
  967. esac
  968. case "$cur" in
  969. -*)
  970. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  971. ;;
  972. esac
  973. }
  974. _docker_network_rm() {
  975. _docker_network_inspect
  976. }
  977. _docker_network() {
  978. local subcommands="
  979. connect
  980. create
  981. disconnect
  982. inspect
  983. ls
  984. rm
  985. "
  986. __docker_subcommands "$subcommands" && return
  987. case "$cur" in
  988. -*)
  989. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  990. ;;
  991. *)
  992. COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
  993. ;;
  994. esac
  995. }
  996. _docker_pause() {
  997. case "$cur" in
  998. -*)
  999. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1000. ;;
  1001. *)
  1002. local counter=$(__docker_pos_first_nonflag)
  1003. if [ $cword -eq $counter ]; then
  1004. __docker_containers_pauseable
  1005. fi
  1006. ;;
  1007. esac
  1008. }
  1009. _docker_port() {
  1010. case "$cur" in
  1011. -*)
  1012. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1013. ;;
  1014. *)
  1015. local counter=$(__docker_pos_first_nonflag)
  1016. if [ $cword -eq $counter ]; then
  1017. __docker_containers_all
  1018. fi
  1019. ;;
  1020. esac
  1021. }
  1022. _docker_ps() {
  1023. case "$prev" in
  1024. --before|--since)
  1025. __docker_containers_all
  1026. ;;
  1027. --filter|-f)
  1028. COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) )
  1029. __docker_nospace
  1030. return
  1031. ;;
  1032. --format|-n)
  1033. return
  1034. ;;
  1035. esac
  1036. case "${words[$cword-2]}$prev=" in
  1037. *ancestor=*)
  1038. cur="${cur#=}"
  1039. __docker_images
  1040. return
  1041. ;;
  1042. *id=*)
  1043. cur="${cur#=}"
  1044. __docker_container_ids
  1045. return
  1046. ;;
  1047. *name=*)
  1048. cur="${cur#=}"
  1049. __docker_container_names
  1050. return
  1051. ;;
  1052. *status=*)
  1053. COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
  1054. return
  1055. ;;
  1056. esac
  1057. case "$cur" in
  1058. -*)
  1059. COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
  1060. ;;
  1061. esac
  1062. }
  1063. _docker_pull() {
  1064. case "$cur" in
  1065. -*)
  1066. COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
  1067. ;;
  1068. *)
  1069. local counter=$(__docker_pos_first_nonflag)
  1070. if [ $cword -eq $counter ]; then
  1071. for arg in "${COMP_WORDS[@]}"; do
  1072. case "$arg" in
  1073. --all-tags|-a)
  1074. __docker_image_repos
  1075. return
  1076. ;;
  1077. esac
  1078. done
  1079. __docker_image_repos_and_tags
  1080. fi
  1081. ;;
  1082. esac
  1083. }
  1084. _docker_push() {
  1085. case "$cur" in
  1086. -*)
  1087. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1088. ;;
  1089. *)
  1090. local counter=$(__docker_pos_first_nonflag)
  1091. if [ $cword -eq $counter ]; then
  1092. __docker_image_repos_and_tags
  1093. fi
  1094. ;;
  1095. esac
  1096. }
  1097. _docker_rename() {
  1098. case "$cur" in
  1099. -*)
  1100. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1101. ;;
  1102. *)
  1103. local counter=$(__docker_pos_first_nonflag)
  1104. if [ $cword -eq $counter ]; then
  1105. __docker_containers_all
  1106. fi
  1107. ;;
  1108. esac
  1109. }
  1110. _docker_restart() {
  1111. case "$prev" in
  1112. --time|-t)
  1113. return
  1114. ;;
  1115. esac
  1116. case "$cur" in
  1117. -*)
  1118. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1119. ;;
  1120. *)
  1121. __docker_containers_all
  1122. ;;
  1123. esac
  1124. }
  1125. _docker_rm() {
  1126. case "$cur" in
  1127. -*)
  1128. COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
  1129. ;;
  1130. *)
  1131. for arg in "${COMP_WORDS[@]}"; do
  1132. case "$arg" in
  1133. --force|-f)
  1134. __docker_containers_all
  1135. return
  1136. ;;
  1137. esac
  1138. done
  1139. __docker_containers_stopped
  1140. ;;
  1141. esac
  1142. }
  1143. _docker_rmi() {
  1144. case "$cur" in
  1145. -*)
  1146. COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
  1147. ;;
  1148. *)
  1149. __docker_images
  1150. ;;
  1151. esac
  1152. }
  1153. _docker_run() {
  1154. local options_with_args="
  1155. --add-host
  1156. --attach -a
  1157. --blkio-weight
  1158. --cap-add
  1159. --cap-drop
  1160. --cgroup-parent
  1161. --cidfile
  1162. --cpu-period
  1163. --cpu-quota
  1164. --cpuset-cpus
  1165. --cpuset-mems
  1166. --cpu-shares -c
  1167. --device
  1168. --dns
  1169. --dns-opt
  1170. --dns-search
  1171. --entrypoint
  1172. --env -e
  1173. --env-file
  1174. --expose
  1175. --group-add
  1176. --hostname -h
  1177. --ipc
  1178. --kernel-memory
  1179. --label-file
  1180. --label -l
  1181. --link
  1182. --log-driver
  1183. --log-opt
  1184. --lxc-conf
  1185. --mac-address
  1186. --memory -m
  1187. --memory-swap
  1188. --memory-swappiness
  1189. --memory-reservation
  1190. --name
  1191. --net
  1192. --pid
  1193. --publish -p
  1194. --restart
  1195. --security-opt
  1196. --stop-signal
  1197. --ulimit
  1198. --user -u
  1199. --uts
  1200. --volumes-from
  1201. --volume -v
  1202. --workdir -w
  1203. "
  1204. local all_options="$options_with_args
  1205. --disable-content-trust=false
  1206. --help
  1207. --interactive -i
  1208. --oom-kill-disable
  1209. --privileged
  1210. --publish-all -P
  1211. --read-only
  1212. --tty -t
  1213. "
  1214. [ "$command" = "run" ] && all_options="$all_options
  1215. --detach -d
  1216. --rm
  1217. --sig-proxy=false
  1218. "
  1219. local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
  1220. case "$prev" in
  1221. --add-host)
  1222. case "$cur" in
  1223. *:)
  1224. __docker_resolve_hostname
  1225. return
  1226. ;;
  1227. esac
  1228. ;;
  1229. --attach|-a)
  1230. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  1231. return
  1232. ;;
  1233. --cap-add|--cap-drop)
  1234. __docker_capabilities
  1235. return
  1236. ;;
  1237. --cidfile|--env-file|--label-file)
  1238. _filedir
  1239. return
  1240. ;;
  1241. --device|--volume|-v)
  1242. case "$cur" in
  1243. *:*)
  1244. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  1245. ;;
  1246. '')
  1247. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  1248. __docker_nospace
  1249. ;;
  1250. /*)
  1251. _filedir
  1252. __docker_nospace
  1253. ;;
  1254. esac
  1255. return
  1256. ;;
  1257. --env|-e)
  1258. COMPREPLY=( $( compgen -e -- "$cur" ) )
  1259. __docker_nospace
  1260. return
  1261. ;;
  1262. --ipc)
  1263. case "$cur" in
  1264. *:*)
  1265. cur="${cur#*:}"
  1266. __docker_containers_running
  1267. ;;
  1268. *)
  1269. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  1270. if [ "$COMPREPLY" = "container:" ]; then
  1271. __docker_nospace
  1272. fi
  1273. ;;
  1274. esac
  1275. return
  1276. ;;
  1277. --link)
  1278. case "$cur" in
  1279. *:*)
  1280. ;;
  1281. *)
  1282. __docker_containers_running
  1283. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  1284. __docker_nospace
  1285. ;;
  1286. esac
  1287. return
  1288. ;;
  1289. --log-driver)
  1290. __docker_log_drivers
  1291. return
  1292. ;;
  1293. --log-opt)
  1294. __docker_log_driver_options
  1295. return
  1296. ;;
  1297. --net)
  1298. case "$cur" in
  1299. container:*)
  1300. local cur=${cur#*:}
  1301. __docker_containers_all
  1302. ;;
  1303. *)
  1304. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  1305. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  1306. __docker_nospace
  1307. fi
  1308. ;;
  1309. esac
  1310. return
  1311. ;;
  1312. --restart)
  1313. case "$cur" in
  1314. on-failure:*)
  1315. ;;
  1316. *)
  1317. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  1318. ;;
  1319. esac
  1320. return
  1321. ;;
  1322. --security-opt)
  1323. case "$cur" in
  1324. label:*:*)
  1325. ;;
  1326. label:*)
  1327. local cur=${cur##*:}
  1328. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  1329. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  1330. __docker_nospace
  1331. fi
  1332. ;;
  1333. *)
  1334. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  1335. __docker_nospace
  1336. ;;
  1337. esac
  1338. return
  1339. ;;
  1340. --volumes-from)
  1341. __docker_containers_all
  1342. return
  1343. ;;
  1344. $options_with_args_glob )
  1345. return
  1346. ;;
  1347. esac
  1348. __docker_complete_log_driver_options && return
  1349. case "$cur" in
  1350. -*)
  1351. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  1352. ;;
  1353. *)
  1354. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  1355. if [ $cword -eq $counter ]; then
  1356. __docker_images
  1357. fi
  1358. ;;
  1359. esac
  1360. }
  1361. _docker_save() {
  1362. case "$prev" in
  1363. --output|-o)
  1364. _filedir
  1365. return
  1366. ;;
  1367. esac
  1368. case "$cur" in
  1369. -*)
  1370. COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
  1371. ;;
  1372. *)
  1373. __docker_images
  1374. ;;
  1375. esac
  1376. }
  1377. _docker_search() {
  1378. case "$prev" in
  1379. --stars|-s)
  1380. return
  1381. ;;
  1382. esac
  1383. case "$cur" in
  1384. -*)
  1385. COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
  1386. ;;
  1387. esac
  1388. }
  1389. _docker_start() {
  1390. case "$cur" in
  1391. -*)
  1392. COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
  1393. ;;
  1394. *)
  1395. __docker_containers_stopped
  1396. ;;
  1397. esac
  1398. }
  1399. _docker_stats() {
  1400. case "$cur" in
  1401. -*)
  1402. COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) )
  1403. ;;
  1404. *)
  1405. __docker_containers_running
  1406. ;;
  1407. esac
  1408. }
  1409. _docker_stop() {
  1410. case "$prev" in
  1411. --time|-t)
  1412. return
  1413. ;;
  1414. esac
  1415. case "$cur" in
  1416. -*)
  1417. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1418. ;;
  1419. *)
  1420. __docker_containers_running
  1421. ;;
  1422. esac
  1423. }
  1424. _docker_tag() {
  1425. case "$cur" in
  1426. -*)
  1427. COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
  1428. ;;
  1429. *)
  1430. local counter=$(__docker_pos_first_nonflag)
  1431. if [ $cword -eq $counter ]; then
  1432. __docker_image_repos_and_tags
  1433. return
  1434. fi
  1435. (( counter++ ))
  1436. if [ $cword -eq $counter ]; then
  1437. __docker_image_repos_and_tags
  1438. return
  1439. fi
  1440. ;;
  1441. esac
  1442. }
  1443. _docker_unpause() {
  1444. case "$cur" in
  1445. -*)
  1446. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1447. ;;
  1448. *)
  1449. local counter=$(__docker_pos_first_nonflag)
  1450. if [ $cword -eq $counter ]; then
  1451. __docker_containers_unpauseable
  1452. fi
  1453. ;;
  1454. esac
  1455. }
  1456. _docker_top() {
  1457. case "$cur" in
  1458. -*)
  1459. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1460. ;;
  1461. *)
  1462. local counter=$(__docker_pos_first_nonflag)
  1463. if [ $cword -eq $counter ]; then
  1464. __docker_containers_running
  1465. fi
  1466. ;;
  1467. esac
  1468. }
  1469. _docker_version() {
  1470. case "$cur" in
  1471. -*)
  1472. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1473. ;;
  1474. esac
  1475. }
  1476. _docker_volume_create() {
  1477. case "$prev" in
  1478. --driver|-d)
  1479. COMPREPLY=( $( compgen -W "local" -- "$cur" ) )
  1480. return
  1481. ;;
  1482. --name|--opt|-o)
  1483. return
  1484. ;;
  1485. esac
  1486. case "$cur" in
  1487. -*)
  1488. COMPREPLY=( $( compgen -W "--driver -d --help --name --opt -o" -- "$cur" ) )
  1489. ;;
  1490. esac
  1491. }
  1492. _docker_volume_inspect() {
  1493. case "$prev" in
  1494. --format|-f)
  1495. return
  1496. ;;
  1497. esac
  1498. case "$cur" in
  1499. -*)
  1500. COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
  1501. ;;
  1502. *)
  1503. __docker_volumes
  1504. ;;
  1505. esac
  1506. }
  1507. _docker_volume_ls() {
  1508. case "$prev" in
  1509. --filter|-f)
  1510. COMPREPLY=( $( compgen -W "dangling=true" -- "$cur" ) )
  1511. return
  1512. ;;
  1513. esac
  1514. case "$cur" in
  1515. -*)
  1516. COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) )
  1517. ;;
  1518. esac
  1519. }
  1520. _docker_volume_rm() {
  1521. case "$cur" in
  1522. -*)
  1523. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1524. ;;
  1525. *)
  1526. __docker_volumes
  1527. ;;
  1528. esac
  1529. }
  1530. _docker_volume() {
  1531. local subcommands="
  1532. create
  1533. inspect
  1534. ls
  1535. rm
  1536. "
  1537. __docker_subcommands "$subcommands" && return
  1538. case "$cur" in
  1539. -*)
  1540. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1541. ;;
  1542. *)
  1543. COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
  1544. ;;
  1545. esac
  1546. }
  1547. _docker_wait() {
  1548. case "$cur" in
  1549. -*)
  1550. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1551. ;;
  1552. *)
  1553. __docker_containers_all
  1554. ;;
  1555. esac
  1556. }
  1557. _docker() {
  1558. local previous_extglob_setting=$(shopt -p extglob)
  1559. shopt -s extglob
  1560. local commands=(
  1561. attach
  1562. build
  1563. commit
  1564. cp
  1565. create
  1566. daemon
  1567. diff
  1568. events
  1569. exec
  1570. export
  1571. history
  1572. images
  1573. import
  1574. info
  1575. inspect
  1576. kill
  1577. load
  1578. login
  1579. logout
  1580. logs
  1581. network
  1582. pause
  1583. port
  1584. ps
  1585. pull
  1586. push
  1587. rename
  1588. restart
  1589. rm
  1590. rmi
  1591. run
  1592. save
  1593. search
  1594. start
  1595. stats
  1596. stop
  1597. tag
  1598. top
  1599. unpause
  1600. version
  1601. volume
  1602. wait
  1603. )
  1604. # These options are valid as global options for all client commands
  1605. # and valid as command options for `docker daemon`
  1606. local global_boolean_options="
  1607. --debug -D
  1608. --tls
  1609. --tlsverify
  1610. "
  1611. local global_options_with_args="
  1612. --config
  1613. --host -H
  1614. --log-level -l
  1615. --tlscacert
  1616. --tlscert
  1617. --tlskey
  1618. "
  1619. local host config
  1620. COMPREPLY=()
  1621. local cur prev words cword
  1622. _get_comp_words_by_ref -n : cur prev words cword
  1623. local command='docker' command_pos=0 subcommand_pos
  1624. local counter=1
  1625. while [ $counter -lt $cword ]; do
  1626. case "${words[$counter]}" in
  1627. # save host so that completion can use custom daemon
  1628. --host|-H)
  1629. (( counter++ ))
  1630. host="${words[$counter]}"
  1631. ;;
  1632. # save config so that completion can use custom configuration directories
  1633. --config)
  1634. (( counter++ ))
  1635. config="${words[$counter]}"
  1636. ;;
  1637. $(__docker_to_extglob "$global_options_with_args") )
  1638. (( counter++ ))
  1639. ;;
  1640. -*)
  1641. ;;
  1642. =)
  1643. (( counter++ ))
  1644. ;;
  1645. *)
  1646. command="${words[$counter]}"
  1647. command_pos=$counter
  1648. break
  1649. ;;
  1650. esac
  1651. (( counter++ ))
  1652. done
  1653. local completions_func=_docker_${command}
  1654. declare -F $completions_func >/dev/null && $completions_func
  1655. eval "$previous_extglob_setting"
  1656. return 0
  1657. }
  1658. complete -F _docker docker