docker 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842
  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. local options_with_args="
  420. --build-arg
  421. --cgroup-parent
  422. --cpuset-cpus
  423. --cpuset-mems
  424. --cpu-shares
  425. --cpu-period
  426. --cpu-quota
  427. --file -f
  428. --memory -m
  429. --memory-swap
  430. --tag -t
  431. --ulimit
  432. "
  433. local boolean_options="
  434. --disable-content-trust=false
  435. --force-rm
  436. --help
  437. --no-cache
  438. --pull
  439. --quiet -q
  440. --rm
  441. "
  442. local all_options="$options_with_args $boolean_options"
  443. case "$prev" in
  444. --build-arg)
  445. COMPREPLY=( $( compgen -e -- "$cur" ) )
  446. __docker_nospace
  447. return
  448. ;;
  449. --file|-f)
  450. _filedir
  451. return
  452. ;;
  453. --tag|-t)
  454. __docker_image_repos_and_tags
  455. return
  456. ;;
  457. $(__docker_to_extglob "$options_with_args") )
  458. return
  459. ;;
  460. esac
  461. case "$cur" in
  462. -*)
  463. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  464. ;;
  465. *)
  466. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  467. if [ $cword -eq $counter ]; then
  468. _filedir -d
  469. fi
  470. ;;
  471. esac
  472. }
  473. _docker_commit() {
  474. case "$prev" in
  475. --author|-a|--change|-c|--message|-m)
  476. return
  477. ;;
  478. esac
  479. case "$cur" in
  480. -*)
  481. COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
  482. ;;
  483. *)
  484. local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
  485. if [ $cword -eq $counter ]; then
  486. __docker_containers_all
  487. return
  488. fi
  489. (( counter++ ))
  490. if [ $cword -eq $counter ]; then
  491. __docker_image_repos_and_tags
  492. return
  493. fi
  494. ;;
  495. esac
  496. }
  497. _docker_cp() {
  498. case "$cur" in
  499. -*)
  500. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  501. ;;
  502. *)
  503. local counter=$(__docker_pos_first_nonflag)
  504. if [ $cword -eq $counter ]; then
  505. case "$cur" in
  506. *:)
  507. return
  508. ;;
  509. *)
  510. __docker_containers_all
  511. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  512. __docker_nospace
  513. return
  514. ;;
  515. esac
  516. fi
  517. (( counter++ ))
  518. if [ $cword -eq $counter ]; then
  519. _filedir -d
  520. return
  521. fi
  522. ;;
  523. esac
  524. }
  525. _docker_create() {
  526. _docker_run
  527. }
  528. _docker_daemon() {
  529. local boolean_options="
  530. $global_boolean_options
  531. --disable-legacy-registry
  532. --help
  533. --icc=false
  534. --ip-forward=false
  535. --ip-masq=false
  536. --iptables=false
  537. --ipv6
  538. --selinux-enabled
  539. --userland-proxy=false
  540. "
  541. local options_with_args="
  542. $global_options_with_args
  543. --api-cors-header
  544. --bip
  545. --bridge -b
  546. --cluster-advertise
  547. --cluster-store
  548. --cluster-store-opt
  549. --default-gateway
  550. --default-gateway-v6
  551. --default-ulimit
  552. --dns
  553. --dns-search
  554. --dns-opt
  555. --exec-driver -e
  556. --exec-opt
  557. --exec-root
  558. --fixed-cidr
  559. --fixed-cidr-v6
  560. --graph -g
  561. --group -G
  562. --insecure-registry
  563. --ip
  564. --label
  565. --log-driver
  566. --log-opt
  567. --mtu
  568. --pidfile -p
  569. --registry-mirror
  570. --storage-driver -s
  571. --storage-opt
  572. "
  573. case "$prev" in
  574. --cluster-store)
  575. COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
  576. __docker_nospace
  577. return
  578. ;;
  579. --cluster-store-opt)
  580. COMPREPLY=( $( compgen -W "kv.cacertfile kv.certfile kv.keyfile" -S = -- "$cur" ) )
  581. __docker_nospace
  582. return
  583. ;;
  584. --exec-root|--graph|-g)
  585. _filedir -d
  586. return
  587. ;;
  588. --log-driver)
  589. __docker_log_drivers
  590. return
  591. ;;
  592. --pidfile|-p|--tlscacert|--tlscert|--tlskey)
  593. _filedir
  594. return
  595. ;;
  596. --storage-driver|-s)
  597. COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
  598. return
  599. ;;
  600. --storage-opt)
  601. local devicemapper_options="
  602. dm.basesize
  603. dm.blkdiscard
  604. dm.blocksize
  605. dm.fs
  606. dm.loopdatasize
  607. dm.loopmetadatasize
  608. dm.mkfsarg
  609. dm.mountopt
  610. dm.override_udev_sync_check
  611. dm.thinpooldev
  612. dm.use_deferred_deletion
  613. dm.use_deferred_removal
  614. "
  615. local zfs_options="zfs.fsname"
  616. case $(__docker_value_of_option '--storage-driver|-s') in
  617. '')
  618. COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) )
  619. ;;
  620. devicemapper)
  621. COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) )
  622. ;;
  623. zfs)
  624. COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
  625. ;;
  626. *)
  627. return
  628. ;;
  629. esac
  630. __docker_nospace
  631. return
  632. ;;
  633. --log-level|-l)
  634. __docker_log_levels
  635. return
  636. ;;
  637. --log-opt)
  638. __docker_log_driver_options
  639. return
  640. ;;
  641. $(__docker_to_extglob "$options_with_args") )
  642. return
  643. ;;
  644. esac
  645. __docker_complete_log_driver_options && return
  646. case "${words[$cword-2]}$prev=" in
  647. # completions for --storage-opt
  648. *dm.@(blkdiscard|override_udev_sync_check|use_deferred_@(removal|deletion))=*)
  649. COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) )
  650. return
  651. ;;
  652. *dm.fs=*)
  653. COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) )
  654. return
  655. ;;
  656. *dm.thinpooldev=*)
  657. _filedir
  658. return
  659. ;;
  660. # completions for --cluster-store-opt
  661. *kv.*file=*)
  662. _filedir
  663. return
  664. ;;
  665. esac
  666. case "$cur" in
  667. -*)
  668. COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
  669. ;;
  670. esac
  671. }
  672. _docker_diff() {
  673. case "$cur" in
  674. -*)
  675. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  676. ;;
  677. *)
  678. local counter=$(__docker_pos_first_nonflag)
  679. if [ $cword -eq $counter ]; then
  680. __docker_containers_all
  681. fi
  682. ;;
  683. esac
  684. }
  685. _docker_events() {
  686. case "$prev" in
  687. --filter|-f)
  688. COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
  689. __docker_nospace
  690. return
  691. ;;
  692. --since|--until)
  693. return
  694. ;;
  695. esac
  696. case "${words[$cword-2]}$prev=" in
  697. *container=*)
  698. cur="${cur#=}"
  699. __docker_containers_all
  700. return
  701. ;;
  702. *event=*)
  703. COMPREPLY=( $( compgen -W "
  704. attach
  705. commit
  706. copy
  707. create
  708. delete
  709. destroy
  710. die
  711. exec_create
  712. exec_start
  713. export
  714. import
  715. kill
  716. oom
  717. pause
  718. pull
  719. push
  720. rename
  721. resize
  722. restart
  723. start
  724. stop
  725. tag
  726. top
  727. unpause
  728. untag
  729. " -- "${cur#=}" ) )
  730. return
  731. ;;
  732. *image=*)
  733. cur="${cur#=}"
  734. __docker_images
  735. return
  736. ;;
  737. esac
  738. case "$cur" in
  739. -*)
  740. COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
  741. ;;
  742. esac
  743. }
  744. _docker_exec() {
  745. case "$prev" in
  746. --user|-u)
  747. return
  748. ;;
  749. esac
  750. case "$cur" in
  751. -*)
  752. COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) )
  753. ;;
  754. *)
  755. __docker_containers_running
  756. ;;
  757. esac
  758. }
  759. _docker_export() {
  760. case "$cur" in
  761. -*)
  762. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  763. ;;
  764. *)
  765. local counter=$(__docker_pos_first_nonflag)
  766. if [ $cword -eq $counter ]; then
  767. __docker_containers_all
  768. fi
  769. ;;
  770. esac
  771. }
  772. _docker_help() {
  773. local counter=$(__docker_pos_first_nonflag)
  774. if [ $cword -eq $counter ]; then
  775. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  776. fi
  777. }
  778. _docker_history() {
  779. case "$cur" in
  780. -*)
  781. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  782. ;;
  783. *)
  784. local counter=$(__docker_pos_first_nonflag)
  785. if [ $cword -eq $counter ]; then
  786. __docker_images
  787. fi
  788. ;;
  789. esac
  790. }
  791. _docker_images() {
  792. case "$prev" in
  793. --filter|-f)
  794. COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
  795. if [ "$COMPREPLY" = "label=" ]; then
  796. __docker_nospace
  797. fi
  798. return
  799. ;;
  800. esac
  801. case "${words[$cword-2]}$prev=" in
  802. *dangling=*)
  803. COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
  804. return
  805. ;;
  806. *label=*)
  807. return
  808. ;;
  809. esac
  810. case "$cur" in
  811. -*)
  812. COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
  813. ;;
  814. =)
  815. return
  816. ;;
  817. *)
  818. __docker_image_repos
  819. ;;
  820. esac
  821. }
  822. _docker_import() {
  823. case "$prev" in
  824. --change|-c|--message|-m)
  825. return
  826. ;;
  827. esac
  828. case "$cur" in
  829. -*)
  830. COMPREPLY=( $( compgen -W "--change -c --help --message -m" -- "$cur" ) )
  831. ;;
  832. *)
  833. local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m')
  834. if [ $cword -eq $counter ]; then
  835. return
  836. fi
  837. (( counter++ ))
  838. if [ $cword -eq $counter ]; then
  839. __docker_image_repos_and_tags
  840. return
  841. fi
  842. ;;
  843. esac
  844. }
  845. _docker_info() {
  846. case "$cur" in
  847. -*)
  848. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  849. ;;
  850. esac
  851. }
  852. _docker_inspect() {
  853. case "$prev" in
  854. --format|-f)
  855. return
  856. ;;
  857. --type)
  858. COMPREPLY=( $( compgen -W "image container" -- "$cur" ) )
  859. return
  860. ;;
  861. esac
  862. case "$cur" in
  863. -*)
  864. COMPREPLY=( $( compgen -W "--format -f --help --size -s --type" -- "$cur" ) )
  865. ;;
  866. *)
  867. case $(__docker_value_of_option --type) in
  868. '')
  869. __docker_containers_and_images
  870. ;;
  871. container)
  872. __docker_containers_all
  873. ;;
  874. image)
  875. __docker_images
  876. ;;
  877. esac
  878. esac
  879. }
  880. _docker_kill() {
  881. case "$prev" in
  882. --signal|-s)
  883. __docker_signals
  884. return
  885. ;;
  886. esac
  887. case "$cur" in
  888. -*)
  889. COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
  890. ;;
  891. *)
  892. __docker_containers_running
  893. ;;
  894. esac
  895. }
  896. _docker_load() {
  897. case "$prev" in
  898. --input|-i)
  899. _filedir
  900. return
  901. ;;
  902. esac
  903. case "$cur" in
  904. -*)
  905. COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
  906. ;;
  907. esac
  908. }
  909. _docker_login() {
  910. case "$prev" in
  911. --email|-e|--password|-p|--username|-u)
  912. return
  913. ;;
  914. esac
  915. case "$cur" in
  916. -*)
  917. COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
  918. ;;
  919. esac
  920. }
  921. _docker_logout() {
  922. case "$cur" in
  923. -*)
  924. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  925. ;;
  926. esac
  927. }
  928. _docker_logs() {
  929. case "$prev" in
  930. --since|--tail)
  931. return
  932. ;;
  933. esac
  934. case "$cur" in
  935. -*)
  936. COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) )
  937. ;;
  938. *)
  939. local counter=$(__docker_pos_first_nonflag '--tail')
  940. if [ $cword -eq $counter ]; then
  941. __docker_containers_all
  942. fi
  943. ;;
  944. esac
  945. }
  946. _docker_network_connect() {
  947. case "$cur" in
  948. -*)
  949. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  950. ;;
  951. *)
  952. local counter=$(__docker_pos_first_nonflag '--tail')
  953. if [ $cword -eq $counter ]; then
  954. __docker_networks
  955. elif [ $cword -eq $(($counter + 1)) ]; then
  956. __docker_containers_running
  957. fi
  958. ;;
  959. esac
  960. }
  961. _docker_network_create() {
  962. case "$prev" in
  963. --driver|-d)
  964. # no need to suggest drivers that allow one instance only
  965. # (host, null)
  966. COMPREPLY=( $( compgen -W "bridge overlay" -- "$cur" ) )
  967. return
  968. ;;
  969. esac
  970. case "$cur" in
  971. -*)
  972. COMPREPLY=( $( compgen -W "--driver -d --help" -- "$cur" ) )
  973. ;;
  974. esac
  975. }
  976. _docker_network_disconnect() {
  977. # TODO disconnect should only complete running containers connected
  978. # to the specified network.
  979. _docker_network_connect
  980. }
  981. _docker_network_inspect() {
  982. case "$cur" in
  983. -*)
  984. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  985. ;;
  986. *)
  987. local counter=$(__docker_pos_first_nonflag)
  988. if [ $cword -eq $counter ]; then
  989. __docker_networks
  990. fi
  991. ;;
  992. esac
  993. }
  994. _docker_network_ls() {
  995. case "$prev" in
  996. -n)
  997. return
  998. ;;
  999. esac
  1000. case "$cur" in
  1001. -*)
  1002. COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
  1003. ;;
  1004. esac
  1005. }
  1006. _docker_network_rm() {
  1007. _docker_network_inspect
  1008. }
  1009. _docker_network() {
  1010. local subcommands="
  1011. connect
  1012. create
  1013. disconnect
  1014. inspect
  1015. ls
  1016. rm
  1017. "
  1018. __docker_subcommands "$subcommands" && return
  1019. case "$cur" in
  1020. -*)
  1021. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1022. ;;
  1023. *)
  1024. COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
  1025. ;;
  1026. esac
  1027. }
  1028. _docker_pause() {
  1029. case "$cur" in
  1030. -*)
  1031. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1032. ;;
  1033. *)
  1034. local counter=$(__docker_pos_first_nonflag)
  1035. if [ $cword -eq $counter ]; then
  1036. __docker_containers_pauseable
  1037. fi
  1038. ;;
  1039. esac
  1040. }
  1041. _docker_port() {
  1042. case "$cur" in
  1043. -*)
  1044. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1045. ;;
  1046. *)
  1047. local counter=$(__docker_pos_first_nonflag)
  1048. if [ $cword -eq $counter ]; then
  1049. __docker_containers_all
  1050. fi
  1051. ;;
  1052. esac
  1053. }
  1054. _docker_ps() {
  1055. case "$prev" in
  1056. --before|--since)
  1057. __docker_containers_all
  1058. ;;
  1059. --filter|-f)
  1060. COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) )
  1061. __docker_nospace
  1062. return
  1063. ;;
  1064. --format|-n)
  1065. return
  1066. ;;
  1067. esac
  1068. case "${words[$cword-2]}$prev=" in
  1069. *ancestor=*)
  1070. cur="${cur#=}"
  1071. __docker_images
  1072. return
  1073. ;;
  1074. *id=*)
  1075. cur="${cur#=}"
  1076. __docker_container_ids
  1077. return
  1078. ;;
  1079. *name=*)
  1080. cur="${cur#=}"
  1081. __docker_container_names
  1082. return
  1083. ;;
  1084. *status=*)
  1085. COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
  1086. return
  1087. ;;
  1088. esac
  1089. case "$cur" in
  1090. -*)
  1091. COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
  1092. ;;
  1093. esac
  1094. }
  1095. _docker_pull() {
  1096. case "$cur" in
  1097. -*)
  1098. COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
  1099. ;;
  1100. *)
  1101. local counter=$(__docker_pos_first_nonflag)
  1102. if [ $cword -eq $counter ]; then
  1103. for arg in "${COMP_WORDS[@]}"; do
  1104. case "$arg" in
  1105. --all-tags|-a)
  1106. __docker_image_repos
  1107. return
  1108. ;;
  1109. esac
  1110. done
  1111. __docker_image_repos_and_tags
  1112. fi
  1113. ;;
  1114. esac
  1115. }
  1116. _docker_push() {
  1117. case "$cur" in
  1118. -*)
  1119. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1120. ;;
  1121. *)
  1122. local counter=$(__docker_pos_first_nonflag)
  1123. if [ $cword -eq $counter ]; then
  1124. __docker_image_repos_and_tags
  1125. fi
  1126. ;;
  1127. esac
  1128. }
  1129. _docker_rename() {
  1130. case "$cur" in
  1131. -*)
  1132. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1133. ;;
  1134. *)
  1135. local counter=$(__docker_pos_first_nonflag)
  1136. if [ $cword -eq $counter ]; then
  1137. __docker_containers_all
  1138. fi
  1139. ;;
  1140. esac
  1141. }
  1142. _docker_restart() {
  1143. case "$prev" in
  1144. --time|-t)
  1145. return
  1146. ;;
  1147. esac
  1148. case "$cur" in
  1149. -*)
  1150. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1151. ;;
  1152. *)
  1153. __docker_containers_all
  1154. ;;
  1155. esac
  1156. }
  1157. _docker_rm() {
  1158. case "$cur" in
  1159. -*)
  1160. COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
  1161. ;;
  1162. *)
  1163. for arg in "${COMP_WORDS[@]}"; do
  1164. case "$arg" in
  1165. --force|-f)
  1166. __docker_containers_all
  1167. return
  1168. ;;
  1169. esac
  1170. done
  1171. __docker_containers_stopped
  1172. ;;
  1173. esac
  1174. }
  1175. _docker_rmi() {
  1176. case "$cur" in
  1177. -*)
  1178. COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
  1179. ;;
  1180. *)
  1181. __docker_images
  1182. ;;
  1183. esac
  1184. }
  1185. _docker_run() {
  1186. local options_with_args="
  1187. --add-host
  1188. --attach -a
  1189. --blkio-weight
  1190. --cap-add
  1191. --cap-drop
  1192. --cgroup-parent
  1193. --cidfile
  1194. --cpu-period
  1195. --cpu-quota
  1196. --cpuset-cpus
  1197. --cpuset-mems
  1198. --cpu-shares
  1199. --device
  1200. --dns
  1201. --dns-opt
  1202. --dns-search
  1203. --entrypoint
  1204. --env -e
  1205. --env-file
  1206. --expose
  1207. --group-add
  1208. --hostname -h
  1209. --ipc
  1210. --kernel-memory
  1211. --label-file
  1212. --label -l
  1213. --link
  1214. --log-driver
  1215. --log-opt
  1216. --lxc-conf
  1217. --mac-address
  1218. --memory -m
  1219. --memory-swap
  1220. --memory-swappiness
  1221. --memory-reservation
  1222. --name
  1223. --net
  1224. --pid
  1225. --publish -p
  1226. --restart
  1227. --security-opt
  1228. --stop-signal
  1229. --ulimit
  1230. --user -u
  1231. --uts
  1232. --volumes-from
  1233. --volume -v
  1234. --workdir -w
  1235. "
  1236. local boolean_options="
  1237. --disable-content-trust=false
  1238. --help
  1239. --interactive -i
  1240. --oom-kill-disable
  1241. --privileged
  1242. --publish-all -P
  1243. --read-only
  1244. --tty -t
  1245. "
  1246. local all_options="$options_with_args $boolean_options"
  1247. [ "$command" = "run" ] && all_options="$all_options
  1248. --detach -d
  1249. --rm
  1250. --sig-proxy=false
  1251. "
  1252. case "$prev" in
  1253. --add-host)
  1254. case "$cur" in
  1255. *:)
  1256. __docker_resolve_hostname
  1257. return
  1258. ;;
  1259. esac
  1260. ;;
  1261. --attach|-a)
  1262. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  1263. return
  1264. ;;
  1265. --cap-add|--cap-drop)
  1266. __docker_capabilities
  1267. return
  1268. ;;
  1269. --cidfile|--env-file|--label-file)
  1270. _filedir
  1271. return
  1272. ;;
  1273. --device|--volume|-v)
  1274. case "$cur" in
  1275. *:*)
  1276. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  1277. ;;
  1278. '')
  1279. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  1280. __docker_nospace
  1281. ;;
  1282. /*)
  1283. _filedir
  1284. __docker_nospace
  1285. ;;
  1286. esac
  1287. return
  1288. ;;
  1289. --env|-e)
  1290. COMPREPLY=( $( compgen -e -- "$cur" ) )
  1291. __docker_nospace
  1292. return
  1293. ;;
  1294. --ipc)
  1295. case "$cur" in
  1296. *:*)
  1297. cur="${cur#*:}"
  1298. __docker_containers_running
  1299. ;;
  1300. *)
  1301. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  1302. if [ "$COMPREPLY" = "container:" ]; then
  1303. __docker_nospace
  1304. fi
  1305. ;;
  1306. esac
  1307. return
  1308. ;;
  1309. --link)
  1310. case "$cur" in
  1311. *:*)
  1312. ;;
  1313. *)
  1314. __docker_containers_running
  1315. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  1316. __docker_nospace
  1317. ;;
  1318. esac
  1319. return
  1320. ;;
  1321. --log-driver)
  1322. __docker_log_drivers
  1323. return
  1324. ;;
  1325. --log-opt)
  1326. __docker_log_driver_options
  1327. return
  1328. ;;
  1329. --net)
  1330. case "$cur" in
  1331. container:*)
  1332. local cur=${cur#*:}
  1333. __docker_containers_all
  1334. ;;
  1335. *)
  1336. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  1337. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  1338. __docker_nospace
  1339. fi
  1340. ;;
  1341. esac
  1342. return
  1343. ;;
  1344. --restart)
  1345. case "$cur" in
  1346. on-failure:*)
  1347. ;;
  1348. *)
  1349. COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") )
  1350. ;;
  1351. esac
  1352. return
  1353. ;;
  1354. --security-opt)
  1355. case "$cur" in
  1356. label:*:*)
  1357. ;;
  1358. label:*)
  1359. local cur=${cur##*:}
  1360. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  1361. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  1362. __docker_nospace
  1363. fi
  1364. ;;
  1365. *)
  1366. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  1367. __docker_nospace
  1368. ;;
  1369. esac
  1370. return
  1371. ;;
  1372. --volumes-from)
  1373. __docker_containers_all
  1374. return
  1375. ;;
  1376. $(__docker_to_extglob "$options_with_args") )
  1377. return
  1378. ;;
  1379. esac
  1380. __docker_complete_log_driver_options && return
  1381. case "$cur" in
  1382. -*)
  1383. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  1384. ;;
  1385. *)
  1386. local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
  1387. if [ $cword -eq $counter ]; then
  1388. __docker_images
  1389. fi
  1390. ;;
  1391. esac
  1392. }
  1393. _docker_save() {
  1394. case "$prev" in
  1395. --output|-o)
  1396. _filedir
  1397. return
  1398. ;;
  1399. esac
  1400. case "$cur" in
  1401. -*)
  1402. COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
  1403. ;;
  1404. *)
  1405. __docker_images
  1406. ;;
  1407. esac
  1408. }
  1409. _docker_search() {
  1410. case "$prev" in
  1411. --stars|-s)
  1412. return
  1413. ;;
  1414. esac
  1415. case "$cur" in
  1416. -*)
  1417. COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
  1418. ;;
  1419. esac
  1420. }
  1421. _docker_start() {
  1422. case "$cur" in
  1423. -*)
  1424. COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
  1425. ;;
  1426. *)
  1427. __docker_containers_stopped
  1428. ;;
  1429. esac
  1430. }
  1431. _docker_stats() {
  1432. case "$cur" in
  1433. -*)
  1434. COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) )
  1435. ;;
  1436. *)
  1437. __docker_containers_running
  1438. ;;
  1439. esac
  1440. }
  1441. _docker_stop() {
  1442. case "$prev" in
  1443. --time|-t)
  1444. return
  1445. ;;
  1446. esac
  1447. case "$cur" in
  1448. -*)
  1449. COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
  1450. ;;
  1451. *)
  1452. __docker_containers_running
  1453. ;;
  1454. esac
  1455. }
  1456. _docker_tag() {
  1457. case "$cur" in
  1458. -*)
  1459. COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
  1460. ;;
  1461. *)
  1462. local counter=$(__docker_pos_first_nonflag)
  1463. if [ $cword -eq $counter ]; then
  1464. __docker_image_repos_and_tags
  1465. return
  1466. fi
  1467. (( counter++ ))
  1468. if [ $cword -eq $counter ]; then
  1469. __docker_image_repos_and_tags
  1470. return
  1471. fi
  1472. ;;
  1473. esac
  1474. }
  1475. _docker_unpause() {
  1476. case "$cur" in
  1477. -*)
  1478. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1479. ;;
  1480. *)
  1481. local counter=$(__docker_pos_first_nonflag)
  1482. if [ $cword -eq $counter ]; then
  1483. __docker_containers_unpauseable
  1484. fi
  1485. ;;
  1486. esac
  1487. }
  1488. _docker_top() {
  1489. case "$cur" in
  1490. -*)
  1491. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1492. ;;
  1493. *)
  1494. local counter=$(__docker_pos_first_nonflag)
  1495. if [ $cword -eq $counter ]; then
  1496. __docker_containers_running
  1497. fi
  1498. ;;
  1499. esac
  1500. }
  1501. _docker_version() {
  1502. case "$cur" in
  1503. -*)
  1504. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1505. ;;
  1506. esac
  1507. }
  1508. _docker_volume_create() {
  1509. case "$prev" in
  1510. --driver|-d)
  1511. COMPREPLY=( $( compgen -W "local" -- "$cur" ) )
  1512. return
  1513. ;;
  1514. --name|--opt|-o)
  1515. return
  1516. ;;
  1517. esac
  1518. case "$cur" in
  1519. -*)
  1520. COMPREPLY=( $( compgen -W "--driver -d --help --name --opt -o" -- "$cur" ) )
  1521. ;;
  1522. esac
  1523. }
  1524. _docker_volume_inspect() {
  1525. case "$prev" in
  1526. --format|-f)
  1527. return
  1528. ;;
  1529. esac
  1530. case "$cur" in
  1531. -*)
  1532. COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
  1533. ;;
  1534. *)
  1535. __docker_volumes
  1536. ;;
  1537. esac
  1538. }
  1539. _docker_volume_ls() {
  1540. case "$prev" in
  1541. --filter|-f)
  1542. COMPREPLY=( $( compgen -W "dangling=true" -- "$cur" ) )
  1543. return
  1544. ;;
  1545. esac
  1546. case "$cur" in
  1547. -*)
  1548. COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) )
  1549. ;;
  1550. esac
  1551. }
  1552. _docker_volume_rm() {
  1553. case "$cur" in
  1554. -*)
  1555. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1556. ;;
  1557. *)
  1558. __docker_volumes
  1559. ;;
  1560. esac
  1561. }
  1562. _docker_volume() {
  1563. local subcommands="
  1564. create
  1565. inspect
  1566. ls
  1567. rm
  1568. "
  1569. __docker_subcommands "$subcommands" && return
  1570. case "$cur" in
  1571. -*)
  1572. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1573. ;;
  1574. *)
  1575. COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
  1576. ;;
  1577. esac
  1578. }
  1579. _docker_wait() {
  1580. case "$cur" in
  1581. -*)
  1582. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  1583. ;;
  1584. *)
  1585. __docker_containers_all
  1586. ;;
  1587. esac
  1588. }
  1589. _docker() {
  1590. local previous_extglob_setting=$(shopt -p extglob)
  1591. shopt -s extglob
  1592. local commands=(
  1593. attach
  1594. build
  1595. commit
  1596. cp
  1597. create
  1598. daemon
  1599. diff
  1600. events
  1601. exec
  1602. export
  1603. history
  1604. images
  1605. import
  1606. info
  1607. inspect
  1608. kill
  1609. load
  1610. login
  1611. logout
  1612. logs
  1613. network
  1614. pause
  1615. port
  1616. ps
  1617. pull
  1618. push
  1619. rename
  1620. restart
  1621. rm
  1622. rmi
  1623. run
  1624. save
  1625. search
  1626. start
  1627. stats
  1628. stop
  1629. tag
  1630. top
  1631. unpause
  1632. version
  1633. volume
  1634. wait
  1635. )
  1636. # These options are valid as global options for all client commands
  1637. # and valid as command options for `docker daemon`
  1638. local global_boolean_options="
  1639. --debug -D
  1640. --tls
  1641. --tlsverify
  1642. "
  1643. local global_options_with_args="
  1644. --config
  1645. --host -H
  1646. --log-level -l
  1647. --tlscacert
  1648. --tlscert
  1649. --tlskey
  1650. "
  1651. local host config
  1652. COMPREPLY=()
  1653. local cur prev words cword
  1654. _get_comp_words_by_ref -n : cur prev words cword
  1655. local command='docker' command_pos=0 subcommand_pos
  1656. local counter=1
  1657. while [ $counter -lt $cword ]; do
  1658. case "${words[$counter]}" in
  1659. # save host so that completion can use custom daemon
  1660. --host|-H)
  1661. (( counter++ ))
  1662. host="${words[$counter]}"
  1663. ;;
  1664. # save config so that completion can use custom configuration directories
  1665. --config)
  1666. (( counter++ ))
  1667. config="${words[$counter]}"
  1668. ;;
  1669. $(__docker_to_extglob "$global_options_with_args") )
  1670. (( counter++ ))
  1671. ;;
  1672. -*)
  1673. ;;
  1674. =)
  1675. (( counter++ ))
  1676. ;;
  1677. *)
  1678. command="${words[$counter]}"
  1679. command_pos=$counter
  1680. break
  1681. ;;
  1682. esac
  1683. (( counter++ ))
  1684. done
  1685. local completions_func=_docker_${command}
  1686. declare -F $completions_func >/dev/null && $completions_func
  1687. eval "$previous_extglob_setting"
  1688. return 0
  1689. }
  1690. complete -F _docker docker