docker-compose 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. case "$prev" in
  169. -t | --timeout)
  170. return
  171. ;;
  172. esac
  173. case "$cur" in
  174. -*)
  175. COMPREPLY=( $( compgen -W "-t --timeout" -- "$cur" ) )
  176. ;;
  177. *)
  178. __docker-compose_services_running
  179. ;;
  180. esac
  181. }
  182. _docker-compose_rm() {
  183. case "$cur" in
  184. -*)
  185. COMPREPLY=( $( compgen -W "--force -f -v" -- "$cur" ) )
  186. ;;
  187. *)
  188. __docker-compose_services_stopped
  189. ;;
  190. esac
  191. }
  192. _docker-compose_run() {
  193. case "$prev" in
  194. -e)
  195. COMPREPLY=( $( compgen -e -- "$cur" ) )
  196. compopt -o nospace
  197. return
  198. ;;
  199. --entrypoint|--user|-u)
  200. return
  201. ;;
  202. esac
  203. case "$cur" in
  204. -*)
  205. COMPREPLY=( $( compgen -W "--allow-insecure-ssl -d --entrypoint -e --no-deps --rm --service-ports -T --user -u" -- "$cur" ) )
  206. ;;
  207. *)
  208. __docker-compose_services_all
  209. ;;
  210. esac
  211. }
  212. _docker-compose_scale() {
  213. case "$prev" in
  214. =)
  215. COMPREPLY=("$cur")
  216. ;;
  217. *)
  218. COMPREPLY=( $(compgen -S "=" -W "$(___docker-compose_all_services_in_compose_file)" -- "$cur") )
  219. compopt -o nospace
  220. ;;
  221. esac
  222. }
  223. _docker-compose_start() {
  224. __docker-compose_services_stopped
  225. }
  226. _docker-compose_stop() {
  227. case "$prev" in
  228. -t | --timeout)
  229. return
  230. ;;
  231. esac
  232. case "$cur" in
  233. -*)
  234. COMPREPLY=( $( compgen -W "-t --timeout" -- "$cur" ) )
  235. ;;
  236. *)
  237. __docker-compose_services_running
  238. ;;
  239. esac
  240. }
  241. _docker-compose_up() {
  242. case "$prev" in
  243. -t | --timeout)
  244. return
  245. ;;
  246. esac
  247. case "$cur" in
  248. -*)
  249. COMPREPLY=( $( compgen -W "--allow-insecure-ssl -d --no-build --no-color --no-deps --no-recreate -t --timeout" -- "$cur" ) )
  250. ;;
  251. *)
  252. __docker-compose_services_all
  253. ;;
  254. esac
  255. }
  256. _docker-compose() {
  257. local previous_extglob_setting=$(shopt -p extglob)
  258. shopt -s extglob
  259. local commands=(
  260. build
  261. help
  262. kill
  263. logs
  264. migrate-to-labels
  265. port
  266. ps
  267. pull
  268. restart
  269. rm
  270. run
  271. scale
  272. start
  273. stop
  274. up
  275. )
  276. COMPREPLY=()
  277. local cur prev words cword
  278. _get_comp_words_by_ref -n : cur prev words cword
  279. # search subcommand and invoke its handler.
  280. # special treatment of some top-level options
  281. local command='docker-compose'
  282. local counter=1
  283. local compose_file compose_project
  284. while [ $counter -lt $cword ]; do
  285. case "${words[$counter]}" in
  286. -f|--file)
  287. (( counter++ ))
  288. compose_file="${words[$counter]}"
  289. ;;
  290. -p|--project-name)
  291. (( counter++ ))
  292. compose_project="${words[$counter]}"
  293. ;;
  294. -*)
  295. ;;
  296. *)
  297. command="${words[$counter]}"
  298. break
  299. ;;
  300. esac
  301. (( counter++ ))
  302. done
  303. local completions_func=_docker-compose_${command}
  304. declare -F $completions_func >/dev/null && $completions_func
  305. eval "$previous_extglob_setting"
  306. return 0
  307. }
  308. complete -F _docker-compose docker-compose