docker-compose 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. #!bash
  2. #
  3. # bash completion for docker-compose
  4. #
  5. # This work is based on the completion for the docker command.
  6. #
  7. # This script provides completion of:
  8. # - commands and their options
  9. # - service names
  10. # - filepaths
  11. #
  12. # To enable the completions either:
  13. # - place this file in /etc/bash_completion.d
  14. # or
  15. # - copy this file to e.g. ~/.docker-compose-completion.sh and add the line
  16. # below to your .bashrc after bash completion features are loaded
  17. # . ~/.docker-compose-completion.sh
  18. # For compatibility reasons, Compose and therefore its completion supports several
  19. # stack compositon files as listed here, in descending priority.
  20. # Support for these filenames might be dropped in some future version.
  21. __docker_compose_compose_file() {
  22. local file
  23. for file in docker-compose.y{,a}ml fig.y{,a}ml ; do
  24. [ -e $file ] && {
  25. echo $file
  26. return
  27. }
  28. done
  29. echo docker-compose.yml
  30. }
  31. # Extracts all service names from the compose file.
  32. ___docker_compose_all_services_in_compose_file() {
  33. awk -F: '/^[a-zA-Z0-9]/{print $1}' "${compose_file:-$(__docker_compose_compose_file)}" 2>/dev/null
  34. }
  35. # All services, even those without an existing container
  36. __docker_compose_services_all() {
  37. COMPREPLY=( $(compgen -W "$(___docker_compose_all_services_in_compose_file)" -- "$cur") )
  38. }
  39. # All services that have an entry with the given key in their compose_file section
  40. ___docker_compose_services_with_key() {
  41. # flatten sections to one line, then filter lines containing the key and return section name.
  42. awk '/^[a-zA-Z0-9]/{printf "\n"};{printf $0;next;}' "${compose_file:-$(__docker_compose_compose_file)}" 2>/dev/null | awk -F: -v key=": +$1:" '$0 ~ key {print $1}'
  43. }
  44. # All services that are defined by a Dockerfile reference
  45. __docker_compose_services_from_build() {
  46. COMPREPLY=( $(compgen -W "$(___docker_compose_services_with_key build)" -- "$cur") )
  47. }
  48. # All services that are defined by an image
  49. __docker_compose_services_from_image() {
  50. COMPREPLY=( $(compgen -W "$(___docker_compose_services_with_key image)" -- "$cur") )
  51. }
  52. # The services for which containers have been created, optionally filtered
  53. # by a boolean expression passed in as argument.
  54. __docker_compose_services_with() {
  55. local containers names
  56. containers="$(docker-compose 2>/dev/null ${compose_file:+-f $compose_file} ${compose_project:+-p $compose_project} ps -q)"
  57. names=( $(docker 2>/dev/null inspect --format "{{if ${1:-true}}} {{ .Name }} {{end}}" $containers) )
  58. names=( ${names[@]%_*} ) # strip trailing numbers
  59. names=( ${names[@]#*_} ) # strip project name
  60. COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
  61. }
  62. # The services for which at least one paused container exists
  63. __docker_compose_services_paused() {
  64. __docker_compose_services_with '.State.Paused'
  65. }
  66. # The services for which at least one running container exists
  67. __docker_compose_services_running() {
  68. __docker_compose_services_with '.State.Running'
  69. }
  70. # The services for which at least one stopped container exists
  71. __docker_compose_services_stopped() {
  72. __docker_compose_services_with 'not .State.Running'
  73. }
  74. _docker_compose_build() {
  75. case "$cur" in
  76. -*)
  77. COMPREPLY=( $( compgen -W "--help --no-cache --pull" -- "$cur" ) )
  78. ;;
  79. *)
  80. __docker_compose_services_from_build
  81. ;;
  82. esac
  83. }
  84. _docker_compose_docker_compose() {
  85. case "$prev" in
  86. --file|-f)
  87. _filedir "y?(a)ml"
  88. return
  89. ;;
  90. --project-name|-p)
  91. return
  92. ;;
  93. esac
  94. case "$cur" in
  95. -*)
  96. COMPREPLY=( $( compgen -W "--help -h --verbose --version -v --file -f --project-name -p" -- "$cur" ) )
  97. ;;
  98. *)
  99. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  100. ;;
  101. esac
  102. }
  103. _docker_compose_help() {
  104. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  105. }
  106. _docker_compose_kill() {
  107. case "$prev" in
  108. -s)
  109. COMPREPLY=( $( compgen -W "SIGHUP SIGINT SIGKILL SIGUSR1 SIGUSR2" -- "$(echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  110. return
  111. ;;
  112. esac
  113. case "$cur" in
  114. -*)
  115. COMPREPLY=( $( compgen -W "--help -s" -- "$cur" ) )
  116. ;;
  117. *)
  118. __docker_compose_services_running
  119. ;;
  120. esac
  121. }
  122. _docker_compose_logs() {
  123. case "$cur" in
  124. -*)
  125. COMPREPLY=( $( compgen -W "--help --no-color" -- "$cur" ) )
  126. ;;
  127. *)
  128. __docker_compose_services_all
  129. ;;
  130. esac
  131. }
  132. _docker_compose_migrate_to_labels() {
  133. case "$cur" in
  134. -*)
  135. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  136. ;;
  137. esac
  138. }
  139. _docker_compose_pause() {
  140. case "$cur" in
  141. -*)
  142. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  143. ;;
  144. *)
  145. __docker_compose_services_running
  146. ;;
  147. esac
  148. }
  149. _docker_compose_port() {
  150. case "$prev" in
  151. --protocol)
  152. COMPREPLY=( $( compgen -W "tcp udp" -- "$cur" ) )
  153. return;
  154. ;;
  155. --index)
  156. return;
  157. ;;
  158. esac
  159. case "$cur" in
  160. -*)
  161. COMPREPLY=( $( compgen -W "--help --index --protocol" -- "$cur" ) )
  162. ;;
  163. *)
  164. __docker_compose_services_all
  165. ;;
  166. esac
  167. }
  168. _docker_compose_ps() {
  169. case "$cur" in
  170. -*)
  171. COMPREPLY=( $( compgen -W "--help -q" -- "$cur" ) )
  172. ;;
  173. *)
  174. __docker_compose_services_all
  175. ;;
  176. esac
  177. }
  178. _docker_compose_pull() {
  179. case "$cur" in
  180. -*)
  181. COMPREPLY=( $( compgen -W "--help --ignore-pull-failures" -- "$cur" ) )
  182. ;;
  183. *)
  184. __docker_compose_services_from_image
  185. ;;
  186. esac
  187. }
  188. _docker_compose_restart() {
  189. case "$prev" in
  190. --timeout|-t)
  191. return
  192. ;;
  193. esac
  194. case "$cur" in
  195. -*)
  196. COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) )
  197. ;;
  198. *)
  199. __docker_compose_services_running
  200. ;;
  201. esac
  202. }
  203. _docker_compose_rm() {
  204. case "$cur" in
  205. -*)
  206. COMPREPLY=( $( compgen -W "--force -f --help -v" -- "$cur" ) )
  207. ;;
  208. *)
  209. __docker_compose_services_stopped
  210. ;;
  211. esac
  212. }
  213. _docker_compose_run() {
  214. case "$prev" in
  215. -e)
  216. COMPREPLY=( $( compgen -e -- "$cur" ) )
  217. compopt -o nospace
  218. return
  219. ;;
  220. --entrypoint|--name|--user|-u)
  221. return
  222. ;;
  223. esac
  224. case "$cur" in
  225. -*)
  226. COMPREPLY=( $( compgen -W "-d --entrypoint -e --help --name --no-deps --publish -p --rm --service-ports -T --user -u" -- "$cur" ) )
  227. ;;
  228. *)
  229. __docker_compose_services_all
  230. ;;
  231. esac
  232. }
  233. _docker_compose_scale() {
  234. case "$prev" in
  235. =)
  236. COMPREPLY=("$cur")
  237. return
  238. ;;
  239. --timeout|-t)
  240. return
  241. ;;
  242. esac
  243. case "$cur" in
  244. -*)
  245. COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) )
  246. ;;
  247. *)
  248. COMPREPLY=( $(compgen -S "=" -W "$(___docker_compose_all_services_in_compose_file)" -- "$cur") )
  249. compopt -o nospace
  250. ;;
  251. esac
  252. }
  253. _docker_compose_start() {
  254. case "$cur" in
  255. -*)
  256. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  257. ;;
  258. *)
  259. __docker_compose_services_stopped
  260. ;;
  261. esac
  262. }
  263. _docker_compose_stop() {
  264. case "$prev" in
  265. --timeout|-t)
  266. return
  267. ;;
  268. esac
  269. case "$cur" in
  270. -*)
  271. COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) )
  272. ;;
  273. *)
  274. __docker_compose_services_running
  275. ;;
  276. esac
  277. }
  278. _docker_compose_unpause() {
  279. case "$cur" in
  280. -*)
  281. COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
  282. ;;
  283. *)
  284. __docker_compose_services_paused
  285. ;;
  286. esac
  287. }
  288. _docker_compose_up() {
  289. case "$prev" in
  290. --timeout|-t)
  291. return
  292. ;;
  293. esac
  294. case "$cur" in
  295. -*)
  296. COMPREPLY=( $( compgen -W "-d --help --no-build --no-color --no-deps --no-recreate --force-recreate --timeout -t" -- "$cur" ) )
  297. ;;
  298. *)
  299. __docker_compose_services_all
  300. ;;
  301. esac
  302. }
  303. _docker_compose_version() {
  304. case "$cur" in
  305. -*)
  306. COMPREPLY=( $( compgen -W "--short" -- "$cur" ) )
  307. ;;
  308. esac
  309. }
  310. _docker_compose() {
  311. local previous_extglob_setting=$(shopt -p extglob)
  312. shopt -s extglob
  313. local commands=(
  314. build
  315. help
  316. kill
  317. logs
  318. migrate-to-labels
  319. pause
  320. port
  321. ps
  322. pull
  323. restart
  324. rm
  325. run
  326. scale
  327. start
  328. stop
  329. unpause
  330. up
  331. version
  332. )
  333. COMPREPLY=()
  334. local cur prev words cword
  335. _get_comp_words_by_ref -n : cur prev words cword
  336. # search subcommand and invoke its handler.
  337. # special treatment of some top-level options
  338. local command='docker_compose'
  339. local counter=1
  340. local compose_file compose_project
  341. while [ $counter -lt $cword ]; do
  342. case "${words[$counter]}" in
  343. --file|-f)
  344. (( counter++ ))
  345. compose_file="${words[$counter]}"
  346. ;;
  347. --project-name|p)
  348. (( counter++ ))
  349. compose_project="${words[$counter]}"
  350. ;;
  351. -*)
  352. ;;
  353. *)
  354. command="${words[$counter]}"
  355. break
  356. ;;
  357. esac
  358. (( counter++ ))
  359. done
  360. local completions_func=_docker_compose_${command//-/_}
  361. declare -F $completions_func >/dev/null && $completions_func
  362. eval "$previous_extglob_setting"
  363. return 0
  364. }
  365. complete -F _docker_compose docker-compose