docker 34 KB

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