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