github.com/goern/docker@v1.9.0-rc1/contrib/completion/bash/docker (about) 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 # 34 # Note: 35 # Currently, the completions will not work if the docker daemon is not 36 # bound to the default communication port/socket 37 # If the docker daemon is using a unix socket for communication your user 38 # must have access to the socket for the completions to function correctly 39 # 40 # Note for developers: 41 # Please arrange options sorted alphabetically by long name with the short 42 # options immediately following their corresponding long form. 43 # This order should be applied to lists, alternatives and code blocks. 44 45 __docker_q() { 46 docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@" 47 } 48 49 __docker_containers_all() { 50 local IFS=$'\n' 51 local containers=( $(__docker_q ps -aq --no-trunc) ) 52 if [ "$1" ]; then 53 containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") ) 54 fi 55 local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") ) 56 names=( "${names[@]#/}" ) # trim off the leading "/" from the container names 57 unset IFS 58 COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") ) 59 } 60 61 __docker_containers_running() { 62 __docker_containers_all '.State.Running' 63 } 64 65 __docker_containers_stopped() { 66 __docker_containers_all 'not .State.Running' 67 } 68 69 __docker_containers_pauseable() { 70 __docker_containers_all 'and .State.Running (not .State.Paused)' 71 } 72 73 __docker_containers_unpauseable() { 74 __docker_containers_all '.State.Paused' 75 } 76 77 __docker_container_names() { 78 local containers=( $(__docker_q ps -aq --no-trunc) ) 79 local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") ) 80 names=( "${names[@]#/}" ) # trim off the leading "/" from the container names 81 COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") ) 82 } 83 84 __docker_container_ids() { 85 local containers=( $(__docker_q ps -aq) ) 86 COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") ) 87 } 88 89 __docker_images() { 90 local images_args="" 91 92 case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in 93 all) 94 images_args="--no-trunc -a" 95 ;; 96 non-intermediate) 97 images_args="--no-trunc" 98 ;; 99 esac 100 101 local repo_print_command 102 if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then 103 repo_print_command='print $1; print $1":"$2' 104 else 105 repo_print_command='print $1' 106 fi 107 108 local awk_script 109 case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in 110 all|non-intermediate) 111 awk_script='NR>1 { print $3; if ($1 != "<none>") { '"$repo_print_command"' } }' 112 ;; 113 none|*) 114 awk_script='NR>1 && $1 != "<none>" { '"$repo_print_command"' }' 115 ;; 116 esac 117 118 local images=$(__docker_q images $images_args | awk "$awk_script") 119 COMPREPLY=( $(compgen -W "$images" -- "$cur") ) 120 __ltrim_colon_completions "$cur" 121 } 122 123 __docker_image_repos() { 124 local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')" 125 COMPREPLY=( $(compgen -W "$repos" -- "$cur") ) 126 } 127 128 __docker_image_repos_and_tags() { 129 local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')" 130 COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") ) 131 __ltrim_colon_completions "$cur" 132 } 133 134 __docker_containers_and_images() { 135 __docker_containers_all 136 local containers=( "${COMPREPLY[@]}" ) 137 __docker_images 138 COMPREPLY+=( "${containers[@]}" ) 139 } 140 141 __docker_networks() { 142 COMPREPLY=( $(compgen -W "$(__docker_q network ls | awk 'NR>1 {print $2}')" -- "$cur") ) 143 } 144 145 __docker_volumes() { 146 COMPREPLY=( $(compgen -W "$(__docker_q volume ls -q)" -- "$cur") ) 147 } 148 149 # Finds the position of the first word that is neither option nor an option's argument. 150 # If there are options that require arguments, you should pass a glob describing those 151 # options, e.g. "--option1|-o|--option2" 152 # Use this function to restrict completions to exact positions after the argument list. 153 __docker_pos_first_nonflag() { 154 local argument_flags=$1 155 156 local counter=$((${subcommand_pos:-${command_pos}} + 1)) 157 while [ $counter -le $cword ]; do 158 if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then 159 (( counter++ )) 160 # eat "=" in case of --option=arg syntax 161 [ "${words[$counter]}" = "=" ] && (( counter++ )) 162 else 163 case "${words[$counter]}" in 164 -*) 165 ;; 166 *) 167 break 168 ;; 169 esac 170 fi 171 172 # Bash splits words at "=", retaining "=" as a word, examples: 173 # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words 174 while [ "${words[$counter + 1]}" = "=" ] ; do 175 counter=$(( counter + 2)) 176 done 177 178 (( counter++ )) 179 done 180 181 echo $counter 182 } 183 184 # Returns the value of the first option matching option_glob. 185 # Valid values for option_glob are option names like '--log-level' and 186 # globs like '--log-level|-l' 187 # Only positions between the command and the current word are considered. 188 __docker_value_of_option() { 189 local option_extglob=$(__docker_to_extglob "$1") 190 191 local counter=$((command_pos + 1)) 192 while [ $counter -lt $cword ]; do 193 case ${words[$counter]} in 194 $option_extglob ) 195 echo ${words[$counter + 1]} 196 break 197 ;; 198 esac 199 (( counter++ )) 200 done 201 } 202 203 # Transforms a multiline list of strings into a single line string 204 # with the words separated by "|". 205 # This is used to prepare arguments to __docker_pos_first_nonflag(). 206 __docker_to_alternatives() { 207 local parts=( $1 ) 208 local IFS='|' 209 echo "${parts[*]}" 210 } 211 212 # Transforms a multiline list of options into an extglob pattern 213 # suitable for use in case statements. 214 __docker_to_extglob() { 215 local extglob=$( __docker_to_alternatives "$1" ) 216 echo "@($extglob)" 217 } 218 219 # Subcommand processing. 220 # Locates the first occurrence of any of the subcommands contained in the 221 # first argument. In case of a match, calls the corresponding completion 222 # function and returns 0. 223 # If no match is found, 1 is returned. The calling function can then 224 # continue processing its completion. 225 # 226 # TODO if the preceding command has options that accept arguments and an 227 # argument is equal ot one of the subcommands, this is falsely detected as 228 # a match. 229 __docker_subcommands() { 230 local subcommands="$1" 231 232 local counter=$(($command_pos + 1)) 233 while [ $counter -lt $cword ]; do 234 case "${words[$counter]}" in 235 $(__docker_to_extglob "$subcommands") ) 236 subcommand_pos=$counter 237 local subcommand=${words[$counter]} 238 local completions_func=_docker_${command}_${subcommand} 239 declare -F $completions_func >/dev/null && $completions_func 240 return 0 241 ;; 242 esac 243 (( counter++ )) 244 done 245 return 1 246 } 247 248 # suppress trailing whitespace 249 __docker_nospace() { 250 # compopt is not available in ancient bash versions 251 type compopt &>/dev/null && compopt -o nospace 252 } 253 254 __docker_resolve_hostname() { 255 command -v host >/dev/null 2>&1 || return 256 COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') ) 257 } 258 259 __docker_capabilities() { 260 # The list of capabilities is defined in types.go, ALL was added manually. 261 COMPREPLY=( $( compgen -W " 262 ALL 263 AUDIT_CONTROL 264 AUDIT_WRITE 265 AUDIT_READ 266 BLOCK_SUSPEND 267 CHOWN 268 DAC_OVERRIDE 269 DAC_READ_SEARCH 270 FOWNER 271 FSETID 272 IPC_LOCK 273 IPC_OWNER 274 KILL 275 LEASE 276 LINUX_IMMUTABLE 277 MAC_ADMIN 278 MAC_OVERRIDE 279 MKNOD 280 NET_ADMIN 281 NET_BIND_SERVICE 282 NET_BROADCAST 283 NET_RAW 284 SETFCAP 285 SETGID 286 SETPCAP 287 SETUID 288 SYS_ADMIN 289 SYS_BOOT 290 SYS_CHROOT 291 SYSLOG 292 SYS_MODULE 293 SYS_NICE 294 SYS_PACCT 295 SYS_PTRACE 296 SYS_RAWIO 297 SYS_RESOURCE 298 SYS_TIME 299 SYS_TTY_CONFIG 300 WAKE_ALARM 301 " -- "$cur" ) ) 302 } 303 304 __docker_log_drivers() { 305 COMPREPLY=( $( compgen -W " 306 fluentd 307 gelf 308 journald 309 json-file 310 none 311 syslog 312 " -- "$cur" ) ) 313 } 314 315 __docker_log_driver_options() { 316 # see docs/reference/logging/index.md 317 local fluentd_options="fluentd-address tag" 318 local gelf_options="gelf-address tag" 319 local json_file_options="max-file max-size" 320 local syslog_options="syslog-address syslog-facility tag" 321 local awslogs_options="awslogs-region awslogs-group awslogs-stream" 322 323 case $(__docker_value_of_option --log-driver) in 324 '') 325 COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $json_file_options $syslog_options" -S = -- "$cur" ) ) 326 ;; 327 fluentd) 328 COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) ) 329 ;; 330 gelf) 331 COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) ) 332 ;; 333 json-file) 334 COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) ) 335 ;; 336 syslog) 337 COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) ) 338 ;; 339 awslogs) 340 COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) ) 341 ;; 342 *) 343 return 344 ;; 345 esac 346 347 __docker_nospace 348 } 349 350 __docker_complete_log_driver_options() { 351 # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether 352 # it is the last character or not. So we search for "xxx=" in the the last two words. 353 case "${words[$cword-2]}$prev=" in 354 *gelf-address=*) 355 COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) ) 356 __docker_nospace 357 return 358 ;; 359 *syslog-address=*) 360 COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) ) 361 __docker_nospace 362 return 363 ;; 364 *syslog-facility=*) 365 COMPREPLY=( $( compgen -W " 366 auth 367 authpriv 368 cron 369 daemon 370 ftp 371 kern 372 local0 373 local1 374 local2 375 local3 376 local4 377 local5 378 local6 379 local7 380 lpr 381 mail 382 news 383 syslog 384 user 385 uucp 386 " -- "${cur#=}" ) ) 387 return 388 ;; 389 esac 390 return 1 391 } 392 393 __docker_log_levels() { 394 COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) ) 395 } 396 397 # a selection of the available signals that is most likely of interest in the 398 # context of docker containers. 399 __docker_signals() { 400 local signals=( 401 SIGCONT 402 SIGHUP 403 SIGINT 404 SIGKILL 405 SIGQUIT 406 SIGSTOP 407 SIGTERM 408 SIGUSR1 409 SIGUSR2 410 ) 411 COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) ) 412 } 413 414 # global options that may appear after the docker command 415 _docker_docker() { 416 local boolean_options=" 417 $global_boolean_options 418 --help 419 --version -v 420 " 421 422 case "$prev" in 423 --config) 424 _filedir -d 425 return 426 ;; 427 --log-level|-l) 428 __docker_log_levels 429 return 430 ;; 431 $(__docker_to_extglob "$global_options_with_args") ) 432 return 433 ;; 434 esac 435 436 case "$cur" in 437 -*) 438 COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) ) 439 ;; 440 *) 441 local counter=$( __docker_pos_first_nonflag $(__docker_to_extglob "$global_options_with_args") ) 442 if [ $cword -eq $counter ]; then 443 COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) ) 444 fi 445 ;; 446 esac 447 } 448 449 _docker_attach() { 450 case "$cur" in 451 -*) 452 COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) ) 453 ;; 454 *) 455 local counter="$(__docker_pos_first_nonflag)" 456 if [ $cword -eq $counter ]; then 457 __docker_containers_running 458 fi 459 ;; 460 esac 461 } 462 463 _docker_build() { 464 case "$prev" in 465 --cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap) 466 return 467 ;; 468 --file|-f) 469 _filedir 470 return 471 ;; 472 --tag|-t) 473 __docker_image_repos_and_tags 474 return 475 ;; 476 esac 477 478 case "$cur" in 479 -*) 480 COMPREPLY=( $( compgen -W "--cgroup-parent --cpuset-cpus --cpuset-mems --cpu-shares -c --cpu-period --cpu-quota --file -f --force-rm --help --memory -m --memory-swap --no-cache --pull --quiet -q --rm --tag -t --ulimit" -- "$cur" ) ) 481 ;; 482 *) 483 local counter="$(__docker_pos_first_nonflag '--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--file|-f|--memory|-m|--memory-swap|--tag|-t')" 484 if [ $cword -eq $counter ]; then 485 _filedir -d 486 fi 487 ;; 488 esac 489 } 490 491 _docker_commit() { 492 case "$prev" in 493 --author|-a|--change|-c|--message|-m) 494 return 495 ;; 496 esac 497 498 case "$cur" in 499 -*) 500 COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) ) 501 ;; 502 *) 503 local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m') 504 505 if [ $cword -eq $counter ]; then 506 __docker_containers_all 507 return 508 fi 509 (( counter++ )) 510 511 if [ $cword -eq $counter ]; then 512 __docker_image_repos_and_tags 513 return 514 fi 515 ;; 516 esac 517 } 518 519 _docker_cp() { 520 case "$cur" in 521 -*) 522 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 523 ;; 524 *) 525 local counter=$(__docker_pos_first_nonflag) 526 if [ $cword -eq $counter ]; then 527 case "$cur" in 528 *:) 529 return 530 ;; 531 *) 532 __docker_containers_all 533 COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) 534 __docker_nospace 535 return 536 ;; 537 esac 538 fi 539 (( counter++ )) 540 541 if [ $cword -eq $counter ]; then 542 _filedir -d 543 return 544 fi 545 ;; 546 esac 547 } 548 549 _docker_create() { 550 _docker_run 551 } 552 553 _docker_daemon() { 554 local boolean_options=" 555 $global_boolean_options 556 --disable-legacy-registry 557 --help 558 --icc=false 559 --ip-forward=false 560 --ip-masq=false 561 --iptables=false 562 --ipv6 563 --selinux-enabled 564 --userland-proxy=false 565 " 566 local options_with_args=" 567 $global_options_with_args 568 --api-cors-header 569 --bip 570 --bridge -b 571 --cluster-advertise 572 --cluster-store 573 --cluster-store-opt 574 --default-gateway 575 --default-gateway-v6 576 --default-ulimit 577 --dns 578 --dns-search 579 --dns-opt 580 --exec-driver -e 581 --exec-opt 582 --exec-root 583 --fixed-cidr 584 --fixed-cidr-v6 585 --graph -g 586 --group -G 587 --insecure-registry 588 --ip 589 --label 590 --log-driver 591 --log-opt 592 --mtu 593 --pidfile -p 594 --registry-mirror 595 --storage-driver -s 596 --storage-opt 597 " 598 599 case "$prev" in 600 --cluster-store) 601 COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) ) 602 __docker_nospace 603 return 604 ;; 605 --cluster-store-opt) 606 COMPREPLY=( $( compgen -W "kv.cacertfile kv.certfile kv.keyfile" -S = -- "$cur" ) ) 607 __docker_nospace 608 return 609 ;; 610 --exec-root|--graph|-g) 611 _filedir -d 612 return 613 ;; 614 --log-driver) 615 __docker_log_drivers 616 return 617 ;; 618 --pidfile|-p|--tlscacert|--tlscert|--tlskey) 619 _filedir 620 return 621 ;; 622 --storage-driver|-s) 623 COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) ) 624 return 625 ;; 626 --storage-opt) 627 local devicemapper_options=" 628 dm.basesize 629 dm.blkdiscard 630 dm.blocksize 631 dm.fs 632 dm.loopdatasize 633 dm.loopmetadatasize 634 dm.mkfsarg 635 dm.mountopt 636 dm.override_udev_sync_check 637 dm.thinpooldev 638 " 639 local zfs_options="zfs.fsname" 640 641 case $(__docker_value_of_option '--storage-driver|-s') in 642 '') 643 COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) ) 644 ;; 645 devicemapper) 646 COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) ) 647 ;; 648 zfs) 649 COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) ) 650 ;; 651 *) 652 return 653 ;; 654 esac 655 __docker_nospace 656 return 657 ;; 658 --log-level|-l) 659 __docker_log_levels 660 return 661 ;; 662 --log-opt) 663 __docker_log_driver_options 664 return 665 ;; 666 $(__docker_to_extglob "$options_with_args") ) 667 return 668 ;; 669 esac 670 671 __docker_complete_log_driver_options && return 672 673 case "${words[$cword-2]}$prev=" in 674 # completions for --storage-opt 675 *dm.blkdiscard=*) 676 COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) ) 677 return 678 ;; 679 *dm.fs=*) 680 COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) ) 681 return 682 ;; 683 *dm.override_udev_sync_check=*) 684 COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) ) 685 return 686 ;; 687 *dm.thinpooldev=*) 688 _filedir 689 return 690 ;; 691 # completions for --cluster-store-opt 692 *kv.*file=*) 693 _filedir 694 return 695 ;; 696 esac 697 698 case "$cur" in 699 -*) 700 COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) ) 701 ;; 702 esac 703 } 704 705 _docker_diff() { 706 case "$cur" in 707 -*) 708 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 709 ;; 710 *) 711 local counter=$(__docker_pos_first_nonflag) 712 if [ $cword -eq $counter ]; then 713 __docker_containers_all 714 fi 715 ;; 716 esac 717 } 718 719 _docker_events() { 720 case "$prev" in 721 --filter|-f) 722 COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) ) 723 __docker_nospace 724 return 725 ;; 726 --since|--until) 727 return 728 ;; 729 esac 730 731 case "${words[$cword-2]}$prev=" in 732 *container=*) 733 cur="${cur#=}" 734 __docker_containers_all 735 return 736 ;; 737 *event=*) 738 COMPREPLY=( $( compgen -W " 739 attach 740 commit 741 copy 742 create 743 delete 744 destroy 745 die 746 exec_create 747 exec_start 748 export 749 import 750 kill 751 oom 752 pause 753 pull 754 push 755 rename 756 resize 757 restart 758 start 759 stop 760 tag 761 top 762 unpause 763 untag 764 " -- "${cur#=}" ) ) 765 return 766 ;; 767 *image=*) 768 cur="${cur#=}" 769 __docker_images 770 return 771 ;; 772 esac 773 774 case "$cur" in 775 -*) 776 COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) ) 777 ;; 778 esac 779 } 780 781 _docker_exec() { 782 case "$prev" in 783 --user|-u) 784 return 785 ;; 786 esac 787 788 case "$cur" in 789 -*) 790 COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) ) 791 ;; 792 *) 793 __docker_containers_running 794 ;; 795 esac 796 } 797 798 _docker_export() { 799 case "$cur" in 800 -*) 801 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 802 ;; 803 *) 804 local counter=$(__docker_pos_first_nonflag) 805 if [ $cword -eq $counter ]; then 806 __docker_containers_all 807 fi 808 ;; 809 esac 810 } 811 812 _docker_help() { 813 local counter=$(__docker_pos_first_nonflag) 814 if [ $cword -eq $counter ]; then 815 COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) 816 fi 817 } 818 819 _docker_history() { 820 case "$cur" in 821 -*) 822 COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) ) 823 ;; 824 *) 825 local counter=$(__docker_pos_first_nonflag) 826 if [ $cword -eq $counter ]; then 827 __docker_images 828 fi 829 ;; 830 esac 831 } 832 833 _docker_images() { 834 case "$prev" in 835 --filter|-f) 836 COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) ) 837 if [ "$COMPREPLY" = "label=" ]; then 838 __docker_nospace 839 fi 840 return 841 ;; 842 esac 843 844 case "${words[$cword-2]}$prev=" in 845 *dangling=*) 846 COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) ) 847 return 848 ;; 849 *label=*) 850 return 851 ;; 852 esac 853 854 case "$cur" in 855 -*) 856 COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) ) 857 ;; 858 =) 859 return 860 ;; 861 *) 862 __docker_image_repos 863 ;; 864 esac 865 } 866 867 _docker_import() { 868 case "$cur" in 869 -*) 870 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 871 ;; 872 *) 873 local counter=$(__docker_pos_first_nonflag) 874 if [ $cword -eq $counter ]; then 875 return 876 fi 877 (( counter++ )) 878 879 if [ $cword -eq $counter ]; then 880 __docker_image_repos_and_tags 881 return 882 fi 883 ;; 884 esac 885 } 886 887 _docker_info() { 888 case "$cur" in 889 -*) 890 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 891 ;; 892 esac 893 } 894 895 _docker_inspect() { 896 case "$prev" in 897 --format|-f) 898 return 899 ;; 900 --type) 901 COMPREPLY=( $( compgen -W "image container" -- "$cur" ) ) 902 return 903 ;; 904 905 esac 906 907 case "$cur" in 908 -*) 909 COMPREPLY=( $( compgen -W "--format -f --type --help" -- "$cur" ) ) 910 ;; 911 *) 912 case $(__docker_value_of_option --type) in 913 '') 914 __docker_containers_and_images 915 ;; 916 container) 917 __docker_containers_all 918 ;; 919 image) 920 __docker_images 921 ;; 922 esac 923 esac 924 } 925 926 _docker_kill() { 927 case "$prev" in 928 --signal|-s) 929 __docker_signals 930 return 931 ;; 932 esac 933 934 case "$cur" in 935 -*) 936 COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) ) 937 ;; 938 *) 939 __docker_containers_running 940 ;; 941 esac 942 } 943 944 _docker_load() { 945 case "$prev" in 946 --input|-i) 947 _filedir 948 return 949 ;; 950 esac 951 952 case "$cur" in 953 -*) 954 COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) ) 955 ;; 956 esac 957 } 958 959 _docker_login() { 960 case "$prev" in 961 --email|-e|--password|-p|--username|-u) 962 return 963 ;; 964 esac 965 966 case "$cur" in 967 -*) 968 COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) ) 969 ;; 970 esac 971 } 972 973 _docker_logout() { 974 case "$cur" in 975 -*) 976 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 977 ;; 978 esac 979 } 980 981 _docker_logs() { 982 case "$prev" in 983 --since|--tail) 984 return 985 ;; 986 esac 987 988 case "$cur" in 989 -*) 990 COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) ) 991 ;; 992 *) 993 local counter=$(__docker_pos_first_nonflag '--tail') 994 if [ $cword -eq $counter ]; then 995 __docker_containers_all 996 fi 997 ;; 998 esac 999 } 1000 1001 _docker_network_connect() { 1002 case "$cur" in 1003 -*) 1004 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1005 ;; 1006 *) 1007 local counter=$(__docker_pos_first_nonflag '--tail') 1008 if [ $cword -eq $counter ]; then 1009 __docker_networks 1010 elif [ $cword -eq $(($counter + 1)) ]; then 1011 __docker_containers_running 1012 fi 1013 ;; 1014 esac 1015 } 1016 1017 _docker_network_create() { 1018 case "$prev" in 1019 --driver|-d) 1020 # no need to suggest drivers that allow one instance only 1021 # (host, null) 1022 COMPREPLY=( $( compgen -W "bridge overlay" -- "$cur" ) ) 1023 return 1024 ;; 1025 esac 1026 1027 case "$cur" in 1028 -*) 1029 COMPREPLY=( $( compgen -W "--driver -d --help" -- "$cur" ) ) 1030 ;; 1031 esac 1032 } 1033 1034 _docker_network_disconnect() { 1035 # TODO disconnect should only complete running containers connected 1036 # to the specified network. 1037 _docker_network_connect 1038 } 1039 1040 _docker_network_inspect() { 1041 case "$cur" in 1042 -*) 1043 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1044 ;; 1045 *) 1046 local counter=$(__docker_pos_first_nonflag) 1047 if [ $cword -eq $counter ]; then 1048 __docker_networks 1049 fi 1050 ;; 1051 esac 1052 } 1053 1054 _docker_network_ls() { 1055 case "$prev" in 1056 -n) 1057 return 1058 ;; 1059 esac 1060 1061 case "$cur" in 1062 -*) 1063 COMPREPLY=( $( compgen -W "--help --latest -l -n --no-trunc --quiet -q" -- "$cur" ) ) 1064 ;; 1065 esac 1066 } 1067 1068 _docker_network_rm() { 1069 _docker_network_inspect 1070 } 1071 1072 _docker_network() { 1073 local subcommands=" 1074 connect 1075 create 1076 disconnect 1077 inspect 1078 ls 1079 rm 1080 " 1081 __docker_subcommands "$subcommands" && return 1082 1083 case "$cur" in 1084 -*) 1085 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1086 ;; 1087 *) 1088 COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) 1089 ;; 1090 esac 1091 } 1092 1093 _docker_pause() { 1094 case "$cur" in 1095 -*) 1096 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1097 ;; 1098 *) 1099 local counter=$(__docker_pos_first_nonflag) 1100 if [ $cword -eq $counter ]; then 1101 __docker_containers_pauseable 1102 fi 1103 ;; 1104 esac 1105 } 1106 1107 _docker_port() { 1108 case "$cur" in 1109 -*) 1110 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1111 ;; 1112 *) 1113 local counter=$(__docker_pos_first_nonflag) 1114 if [ $cword -eq $counter ]; then 1115 __docker_containers_all 1116 fi 1117 ;; 1118 esac 1119 } 1120 1121 _docker_ps() { 1122 case "$prev" in 1123 --before|--since) 1124 __docker_containers_all 1125 ;; 1126 --filter|-f) 1127 COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) ) 1128 __docker_nospace 1129 return 1130 ;; 1131 --format|-n) 1132 return 1133 ;; 1134 esac 1135 1136 case "${words[$cword-2]}$prev=" in 1137 *ancestor=*) 1138 cur="${cur#=}" 1139 __docker_images 1140 return 1141 ;; 1142 *id=*) 1143 cur="${cur#=}" 1144 __docker_container_ids 1145 return 1146 ;; 1147 *name=*) 1148 cur="${cur#=}" 1149 __docker_container_names 1150 return 1151 ;; 1152 *status=*) 1153 COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) ) 1154 return 1155 ;; 1156 esac 1157 1158 case "$cur" in 1159 -*) 1160 COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) ) 1161 ;; 1162 esac 1163 } 1164 1165 _docker_pull() { 1166 case "$cur" in 1167 -*) 1168 COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) ) 1169 ;; 1170 *) 1171 local counter=$(__docker_pos_first_nonflag) 1172 if [ $cword -eq $counter ]; then 1173 for arg in "${COMP_WORDS[@]}"; do 1174 case "$arg" in 1175 --all-tags|-a) 1176 __docker_image_repos 1177 return 1178 ;; 1179 esac 1180 done 1181 __docker_image_repos_and_tags 1182 fi 1183 ;; 1184 esac 1185 } 1186 1187 _docker_push() { 1188 case "$cur" in 1189 -*) 1190 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1191 ;; 1192 *) 1193 local counter=$(__docker_pos_first_nonflag) 1194 if [ $cword -eq $counter ]; then 1195 __docker_image_repos_and_tags 1196 fi 1197 ;; 1198 esac 1199 } 1200 1201 _docker_rename() { 1202 case "$cur" in 1203 -*) 1204 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1205 ;; 1206 *) 1207 local counter=$(__docker_pos_first_nonflag) 1208 if [ $cword -eq $counter ]; then 1209 __docker_containers_all 1210 fi 1211 ;; 1212 esac 1213 } 1214 1215 _docker_restart() { 1216 case "$prev" in 1217 --time|-t) 1218 return 1219 ;; 1220 esac 1221 1222 case "$cur" in 1223 -*) 1224 COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) 1225 ;; 1226 *) 1227 __docker_containers_all 1228 ;; 1229 esac 1230 } 1231 1232 _docker_rm() { 1233 case "$cur" in 1234 -*) 1235 COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) ) 1236 ;; 1237 *) 1238 for arg in "${COMP_WORDS[@]}"; do 1239 case "$arg" in 1240 --force|-f) 1241 __docker_containers_all 1242 return 1243 ;; 1244 esac 1245 done 1246 __docker_containers_stopped 1247 ;; 1248 esac 1249 } 1250 1251 _docker_rmi() { 1252 case "$cur" in 1253 -*) 1254 COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) ) 1255 ;; 1256 *) 1257 __docker_images 1258 ;; 1259 esac 1260 } 1261 1262 _docker_run() { 1263 local options_with_args=" 1264 --add-host 1265 --attach -a 1266 --blkio-weight 1267 --cap-add 1268 --cap-drop 1269 --cgroup-parent 1270 --cidfile 1271 --cpu-period 1272 --cpu-quota 1273 --cpuset-cpus 1274 --cpuset-mems 1275 --cpu-shares -c 1276 --device 1277 --dns 1278 --dns-opt 1279 --dns-search 1280 --entrypoint 1281 --env -e 1282 --env-file 1283 --expose 1284 --group-add 1285 --hostname -h 1286 --ipc 1287 --kernel-memory 1288 --label-file 1289 --label -l 1290 --link 1291 --log-driver 1292 --log-opt 1293 --lxc-conf 1294 --mac-address 1295 --memory -m 1296 --memory-swap 1297 --memory-swappiness 1298 --memory-reservation 1299 --name 1300 --net 1301 --pid 1302 --publish -p 1303 --restart 1304 --security-opt 1305 --stop-signal 1306 --ulimit 1307 --user -u 1308 --uts 1309 --volumes-from 1310 --volume -v 1311 --workdir -w 1312 " 1313 1314 local all_options="$options_with_args 1315 --disable-content-trust=false 1316 --help 1317 --interactive -i 1318 --oom-kill-disable 1319 --privileged 1320 --publish-all -P 1321 --read-only 1322 --tty -t 1323 " 1324 1325 [ "$command" = "run" ] && all_options="$all_options 1326 --detach -d 1327 --rm 1328 --sig-proxy=false 1329 " 1330 1331 local options_with_args_glob=$(__docker_to_extglob "$options_with_args") 1332 1333 case "$prev" in 1334 --add-host) 1335 case "$cur" in 1336 *:) 1337 __docker_resolve_hostname 1338 return 1339 ;; 1340 esac 1341 ;; 1342 --attach|-a) 1343 COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) ) 1344 return 1345 ;; 1346 --cap-add|--cap-drop) 1347 __docker_capabilities 1348 return 1349 ;; 1350 --cidfile|--env-file|--label-file) 1351 _filedir 1352 return 1353 ;; 1354 --device|--volume|-v) 1355 case "$cur" in 1356 *:*) 1357 # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine) 1358 ;; 1359 '') 1360 COMPREPLY=( $( compgen -W '/' -- "$cur" ) ) 1361 __docker_nospace 1362 ;; 1363 /*) 1364 _filedir 1365 __docker_nospace 1366 ;; 1367 esac 1368 return 1369 ;; 1370 --env|-e) 1371 COMPREPLY=( $( compgen -e -- "$cur" ) ) 1372 __docker_nospace 1373 return 1374 ;; 1375 --ipc) 1376 case "$cur" in 1377 *:*) 1378 cur="${cur#*:}" 1379 __docker_containers_running 1380 ;; 1381 *) 1382 COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) ) 1383 if [ "$COMPREPLY" = "container:" ]; then 1384 __docker_nospace 1385 fi 1386 ;; 1387 esac 1388 return 1389 ;; 1390 --link) 1391 case "$cur" in 1392 *:*) 1393 ;; 1394 *) 1395 __docker_containers_running 1396 COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) 1397 __docker_nospace 1398 ;; 1399 esac 1400 return 1401 ;; 1402 --log-driver) 1403 __docker_log_drivers 1404 return 1405 ;; 1406 --log-opt) 1407 __docker_log_driver_options 1408 return 1409 ;; 1410 --net) 1411 case "$cur" in 1412 container:*) 1413 local cur=${cur#*:} 1414 __docker_containers_all 1415 ;; 1416 *) 1417 COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") ) 1418 if [ "${COMPREPLY[*]}" = "container:" ] ; then 1419 __docker_nospace 1420 fi 1421 ;; 1422 esac 1423 return 1424 ;; 1425 --restart) 1426 case "$cur" in 1427 on-failure:*) 1428 ;; 1429 *) 1430 COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") ) 1431 ;; 1432 esac 1433 return 1434 ;; 1435 --security-opt) 1436 case "$cur" in 1437 label:*:*) 1438 ;; 1439 label:*) 1440 local cur=${cur##*:} 1441 COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") ) 1442 if [ "${COMPREPLY[*]}" != "disable" ] ; then 1443 __docker_nospace 1444 fi 1445 ;; 1446 *) 1447 COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") ) 1448 __docker_nospace 1449 ;; 1450 esac 1451 return 1452 ;; 1453 --volumes-from) 1454 __docker_containers_all 1455 return 1456 ;; 1457 $options_with_args_glob ) 1458 return 1459 ;; 1460 esac 1461 1462 __docker_complete_log_driver_options && return 1463 1464 case "$cur" in 1465 -*) 1466 COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) 1467 ;; 1468 *) 1469 local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) 1470 if [ $cword -eq $counter ]; then 1471 __docker_images 1472 fi 1473 ;; 1474 esac 1475 } 1476 1477 _docker_save() { 1478 case "$prev" in 1479 --output|-o) 1480 _filedir 1481 return 1482 ;; 1483 esac 1484 1485 case "$cur" in 1486 -*) 1487 COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) ) 1488 ;; 1489 *) 1490 __docker_images 1491 ;; 1492 esac 1493 } 1494 1495 _docker_search() { 1496 case "$prev" in 1497 --stars|-s) 1498 return 1499 ;; 1500 esac 1501 1502 case "$cur" in 1503 -*) 1504 COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) ) 1505 ;; 1506 esac 1507 } 1508 1509 _docker_start() { 1510 case "$cur" in 1511 -*) 1512 COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) ) 1513 ;; 1514 *) 1515 __docker_containers_stopped 1516 ;; 1517 esac 1518 } 1519 1520 _docker_stats() { 1521 case "$cur" in 1522 -*) 1523 COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) ) 1524 ;; 1525 *) 1526 __docker_containers_running 1527 ;; 1528 esac 1529 } 1530 1531 _docker_stop() { 1532 case "$prev" in 1533 --time|-t) 1534 return 1535 ;; 1536 esac 1537 1538 case "$cur" in 1539 -*) 1540 COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) 1541 ;; 1542 *) 1543 __docker_containers_running 1544 ;; 1545 esac 1546 } 1547 1548 _docker_tag() { 1549 case "$cur" in 1550 -*) 1551 COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) 1552 ;; 1553 *) 1554 local counter=$(__docker_pos_first_nonflag) 1555 1556 if [ $cword -eq $counter ]; then 1557 __docker_image_repos_and_tags 1558 return 1559 fi 1560 (( counter++ )) 1561 1562 if [ $cword -eq $counter ]; then 1563 __docker_image_repos_and_tags 1564 return 1565 fi 1566 ;; 1567 esac 1568 } 1569 1570 _docker_unpause() { 1571 case "$cur" in 1572 -*) 1573 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1574 ;; 1575 *) 1576 local counter=$(__docker_pos_first_nonflag) 1577 if [ $cword -eq $counter ]; then 1578 __docker_containers_unpauseable 1579 fi 1580 ;; 1581 esac 1582 } 1583 1584 _docker_top() { 1585 case "$cur" in 1586 -*) 1587 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1588 ;; 1589 *) 1590 local counter=$(__docker_pos_first_nonflag) 1591 if [ $cword -eq $counter ]; then 1592 __docker_containers_running 1593 fi 1594 ;; 1595 esac 1596 } 1597 1598 _docker_version() { 1599 case "$cur" in 1600 -*) 1601 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1602 ;; 1603 esac 1604 } 1605 1606 _docker_volume_create() { 1607 case "$prev" in 1608 --driver|-d) 1609 COMPREPLY=( $( compgen -W "local" -- "$cur" ) ) 1610 return 1611 ;; 1612 --name|--opt|-o) 1613 return 1614 ;; 1615 esac 1616 1617 case "$cur" in 1618 -*) 1619 COMPREPLY=( $( compgen -W "--driver -d --help --name --opt -o" -- "$cur" ) ) 1620 ;; 1621 esac 1622 } 1623 1624 _docker_volume_inspect() { 1625 case "$prev" in 1626 --format|-f) 1627 return 1628 ;; 1629 esac 1630 1631 case "$cur" in 1632 -*) 1633 COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) 1634 ;; 1635 *) 1636 __docker_volumes 1637 ;; 1638 esac 1639 } 1640 1641 _docker_volume_ls() { 1642 case "$prev" in 1643 --filter|-f) 1644 COMPREPLY=( $( compgen -W "dangling=true" -- "$cur" ) ) 1645 return 1646 ;; 1647 esac 1648 1649 case "$cur" in 1650 -*) 1651 COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) ) 1652 ;; 1653 esac 1654 } 1655 1656 _docker_volume_rm() { 1657 case "$cur" in 1658 -*) 1659 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1660 ;; 1661 *) 1662 __docker_volumes 1663 ;; 1664 esac 1665 } 1666 1667 _docker_volume() { 1668 local subcommands=" 1669 create 1670 inspect 1671 ls 1672 rm 1673 " 1674 __docker_subcommands "$subcommands" && return 1675 1676 case "$cur" in 1677 -*) 1678 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1679 ;; 1680 *) 1681 COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) 1682 ;; 1683 esac 1684 } 1685 1686 _docker_wait() { 1687 case "$cur" in 1688 -*) 1689 COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) 1690 ;; 1691 *) 1692 __docker_containers_all 1693 ;; 1694 esac 1695 } 1696 1697 _docker() { 1698 local previous_extglob_setting=$(shopt -p extglob) 1699 shopt -s extglob 1700 1701 local commands=( 1702 attach 1703 build 1704 commit 1705 cp 1706 create 1707 daemon 1708 diff 1709 events 1710 exec 1711 export 1712 history 1713 images 1714 import 1715 info 1716 inspect 1717 kill 1718 load 1719 login 1720 logout 1721 logs 1722 network 1723 pause 1724 port 1725 ps 1726 pull 1727 push 1728 rename 1729 restart 1730 rm 1731 rmi 1732 run 1733 save 1734 search 1735 start 1736 stats 1737 stop 1738 tag 1739 top 1740 unpause 1741 version 1742 volume 1743 wait 1744 ) 1745 1746 # These options are valid as global options for all client commands 1747 # and valid as command options for `docker daemon` 1748 local global_boolean_options=" 1749 --debug -D 1750 --tls 1751 --tlsverify 1752 " 1753 local global_options_with_args=" 1754 --config 1755 --host -H 1756 --log-level -l 1757 --tlscacert 1758 --tlscert 1759 --tlskey 1760 " 1761 1762 local host config 1763 1764 COMPREPLY=() 1765 local cur prev words cword 1766 _get_comp_words_by_ref -n : cur prev words cword 1767 1768 local command='docker' command_pos=0 subcommand_pos 1769 local counter=1 1770 while [ $counter -lt $cword ]; do 1771 case "${words[$counter]}" in 1772 # save host so that completion can use custom daemon 1773 --host|-H) 1774 (( counter++ )) 1775 host="${words[$counter]}" 1776 ;; 1777 # save config so that completion can use custom configuration directories 1778 --config) 1779 (( counter++ )) 1780 config="${words[$counter]}" 1781 ;; 1782 $(__docker_to_extglob "$global_options_with_args") ) 1783 (( counter++ )) 1784 ;; 1785 -*) 1786 ;; 1787 =) 1788 (( counter++ )) 1789 ;; 1790 *) 1791 command="${words[$counter]}" 1792 command_pos=$counter 1793 break 1794 ;; 1795 esac 1796 (( counter++ )) 1797 done 1798 1799 local completions_func=_docker_${command} 1800 declare -F $completions_func >/dev/null && $completions_func 1801 1802 eval "$previous_extglob_setting" 1803 return 0 1804 } 1805 1806 complete -F _docker docker