1
0

docker-compose 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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)}" | 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 running container exists
  63. __docker-compose_services_running() {
  64. __docker-compose_services_with '.State.Running'
  65. }
  66. # The services for which at least one stopped container exists
  67. __docker-compose_services_stopped() {
  68. __docker-compose_services_with 'not .State.Running'
  69. }
  70. _docker-compose_build() {
  71. case "$cur" in
  72. -*)
  73. COMPREPLY=( $( compgen -W "--no-cache" -- "$cur" ) )
  74. ;;
  75. *)
  76. __docker-compose_services_from_build
  77. ;;
  78. esac
  79. }
  80. _docker-compose_docker-compose() {
  81. case "$prev" in
  82. --file|-f)
  83. _filedir y?(a)ml
  84. return
  85. ;;
  86. --project-name|-p)
  87. return
  88. ;;
  89. esac
  90. case "$cur" in
  91. -*)
  92. COMPREPLY=( $( compgen -W "--help -h --verbose --version --file -f --project-name -p" -- "$cur" ) )
  93. ;;
  94. *)
  95. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  96. ;;
  97. esac
  98. }
  99. _docker-compose_help() {
  100. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  101. }
  102. _docker-compose_kill() {
  103. case "$prev" in
  104. -s)
  105. COMPREPLY=( $( compgen -W "SIGHUP SIGINT SIGKILL SIGUSR1 SIGUSR2" -- "$(echo $cur | tr '[:lower:]' '[:upper:]')" ) )
  106. return
  107. ;;
  108. esac
  109. case "$cur" in
  110. -*)
  111. COMPREPLY=( $( compgen -W "-s" -- "$cur" ) )
  112. ;;
  113. *)
  114. __docker-compose_services_running
  115. ;;
  116. esac
  117. }
  118. _docker-compose_logs() {
  119. case "$cur" in
  120. -*)
  121. COMPREPLY=( $( compgen -W "--no-color" -- "$cur" ) )
  122. ;;
  123. *)
  124. __docker-compose_services_all
  125. ;;
  126. esac
  127. }
  128. _docker-compose_port() {
  129. case "$prev" in
  130. --protocol)
  131. COMPREPLY=( $( compgen -W "tcp udp" -- "$cur" ) )
  132. return;
  133. ;;
  134. --index)
  135. return;
  136. ;;
  137. esac
  138. case "$cur" in
  139. -*)
  140. COMPREPLY=( $( compgen -W "--protocol --index" -- "$cur" ) )
  141. ;;
  142. *)
  143. __docker-compose_services_all
  144. ;;
  145. esac
  146. }
  147. _docker-compose_ps() {
  148. case "$cur" in
  149. -*)
  150. COMPREPLY=( $( compgen -W "-q" -- "$cur" ) )
  151. ;;
  152. *)
  153. __docker-compose_services_all
  154. ;;
  155. esac
  156. }
  157. _docker-compose_pull() {
  158. case "$cur" in
  159. -*)
  160. COMPREPLY=( $( compgen -W "--allow-insecure-ssl" -- "$cur" ) )
  161. ;;
  162. *)
  163. __docker-compose_services_from_image
  164. ;;
  165. esac
  166. }
  167. _docker-compose_restart() {
  168. __docker-compose_services_running
  169. }
  170. _docker-compose_rm() {
  171. case "$cur" in
  172. -*)
  173. COMPREPLY=( $( compgen -W "--force -v" -- "$cur" ) )
  174. ;;
  175. *)
  176. __docker-compose_services_stopped
  177. ;;
  178. esac
  179. }
  180. _docker-compose_run() {
  181. case "$prev" in
  182. -e)
  183. COMPREPLY=( $( compgen -e -- "$cur" ) )
  184. compopt -o nospace
  185. return
  186. ;;
  187. --entrypoint)
  188. return
  189. ;;
  190. esac
  191. case "$cur" in
  192. -*)
  193. COMPREPLY=( $( compgen -W "--allow-insecure-ssl -d --entrypoint -e --no-deps --rm --service-ports -T" -- "$cur" ) )
  194. ;;
  195. *)
  196. __docker-compose_services_all
  197. ;;
  198. esac
  199. }
  200. _docker-compose_scale() {
  201. case "$prev" in
  202. =)
  203. COMPREPLY=("$cur")
  204. ;;
  205. *)
  206. COMPREPLY=( $(compgen -S "=" -W "$(___docker-compose_all_services_in_compose_file)" -- "$cur") )
  207. compopt -o nospace
  208. ;;
  209. esac
  210. }
  211. _docker-compose_start() {
  212. __docker-compose_services_stopped
  213. }
  214. _docker-compose_stop() {
  215. __docker-compose_services_running
  216. }
  217. _docker-compose_up() {
  218. case "$cur" in
  219. -*)
  220. COMPREPLY=( $( compgen -W "--allow-insecure-ssl -d --no-build --no-color --no-deps --no-recreate" -- "$cur" ) )
  221. ;;
  222. *)
  223. __docker-compose_services_all
  224. ;;
  225. esac
  226. }
  227. _docker-compose() {
  228. local commands=(
  229. build
  230. help
  231. kill
  232. logs
  233. port
  234. ps
  235. pull
  236. restart
  237. rm
  238. run
  239. scale
  240. start
  241. stop
  242. up
  243. )
  244. COMPREPLY=()
  245. local cur prev words cword
  246. _get_comp_words_by_ref -n : cur prev words cword
  247. # search subcommand and invoke its handler.
  248. # special treatment of some top-level options
  249. local command='docker-compose'
  250. local counter=1
  251. local compose_file compose_project
  252. while [ $counter -lt $cword ]; do
  253. case "${words[$counter]}" in
  254. -f|--file)
  255. (( counter++ ))
  256. compose_file="${words[$counter]}"
  257. ;;
  258. -p|--project-name)
  259. (( counter++ ))
  260. compose_project="${words[$counter]}"
  261. ;;
  262. -*)
  263. ;;
  264. *)
  265. command="${words[$counter]}"
  266. break
  267. ;;
  268. esac
  269. (( counter++ ))
  270. done
  271. local completions_func=_docker-compose_${command}
  272. declare -F $completions_func >/dev/null && $completions_func
  273. return 0
  274. }
  275. complete -F _docker-compose docker-compose