Olá!
Hoje o artigo será um pouco diferente dos que geralmente publicamos. Queremos mostrar para vocês como é possível utilizar a funcionalidade de auto complete do shell para os comandos Docker. Mas para quê isso? Simplicidade, facilidade e agilidade na execução de comandos. Quem nunca apertou o tab depois de digitar ‘./conf’? Então, você deve sentir falta dessa facilidade quando utiliza os subcomandos do docker, certo? Queremos mostrar pra vocês como resolver isso.
Como você já viu aqui, existem diversos subcomandos do docker, e cada um possui diversos parâmetros que podem ser utilizados. Com o docker –help, você poderá visualizar as opções disponíveis.
Mas isso é chato algumas vezes… É mais fácil começar a digitar docker run –vol…[tab][tab]e deixar o autocomplete fazer o trabalho:
$ docker run --volume --volume --volume-driver --volumes-from
Vamos instalar?
No Mac OS X
O processo é simples. Estando no Mac OS X, temos que instalar o auto completion usando o brew:
$ brew install bash-completion
E, em seguida, adicionar as linhas em nosso arquivo de profile ($HOME/.bash_profile ou /Users//.bash_profile):
if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi
Você pode executar os seguintes comandos, que devem ser utilizados nesta sequência:
$ echo "if [ -f $(brew --prefix)/etc/bash_completion ]; then" | tee -a $HOME/.bash_profile $ echo " . $(brew --prefix)/etc/bash_completion" | tee -a $HOME/.bash_profile $ echo "fi" | tee -a $HOME/.bash_profile
Atenção: se não temos o homebrew instalado, veja em http://brew.sh/ mais informações de como instalá-lo e utilizá-lo.
No Linux
No Linux, como sempre, é mais simples; basta instalar via gerenciador de pacotes da sua distribuição. Se for Debian like (Ubuntu, Mint etc), usamos o apt-get:
$ sudo apt-get install bash-completion
Se for Red Hat like (RHEL, CentOS, Fedora, etc) então usamos yum:
$ sudo yum install bash-completion
Completion do Docker Engine
O arquivo está disponível em https://github.com/docker/docker/blob/master/contrib/completion/bash/docker, portanto, sempre que fizer uma atualização é recomendável que você baixe novamente esse arquivo para refletir os comandos e parâmetros novos disponibilizados pelo Docker.
Ao baixar, devemos colocá-lo na pasta /etc/bash_completion.d/ se estivermos no Linux. Já se estivermos em um Mac OS X, $(brew –prefix)/etc/bash_completion.d.
No Mac OS X
$ curl -L https://raw.githubusercontent.com/docker/docker/master/contrib/completion/bash/docker > $(brew --prefix)/etc/bash_completion.d/docker
No Linux
$ curl -L https://raw.githubusercontent.com/docker/docker/master/contrib/completion/bash/docker > /etc/bash_completion.d/docker
Completion do Docker Compose
De maneira similar, o arquivo está disponível em https://github.com/docker/compose/blob/master/contrib/completion/bash/docker-compose. Reforçamos que sempre que fizer uma atualização, é bom baixar novamente esse arquivo para refletir os comandos e parâmetros novos disponibilizados pelo Docker Compose.
Ao baixar, também devemos colocá-lo na pasta /etc/bash_completion.d/ se estivermos no Linux ou devemos acrescentar a pasta do homebrew antes. Se estivermos em um Mac OS X, $(brew –prefix)/etc/bash_completion.d.
No Mac OS X
$ curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose > $(brew --prefix)/etc/bash_completion.d/docker-compose
No Linux
$ curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compos
Completion do Docker Machine
O processo é praticamente o mesmo, porém o docker-machine possui três arquivos de auto complete. Os arquivos estão disponíveis em https://github.com/docker/machine/tree/master/contrib/completion/bash.
Como dito anteriormente, devemos colocá-los na pasta /etc/bash_completion.d/ se estivermos no Linux, ou devemos acrescentar a pasta do homebrew antes. Se estivermos em um Mac OS X, $(brew –prefix)/etc/bash_completion.d.
Como são mais arquivos, recomendo utilizarmos um loop para baixarmos todos em sequência utilizando apenas um comando.
No Mac OS X
machineVersion=`docker-machine --version | tr -ds ',' ' ' | awk 'NR==1{print $(3)}'` files=(docker-machine docker-machine-wrapper docker-machine-prompt) for file in "${files[@]}"; do curl -L https://raw.githubusercontent.com/docker/machine/v$machineVersion/contrib/completion/bash/$file.bash > `brew --prefix`/etc/bash_completion.d/$file done unset machineVersion
No Linux
machineVersion=`docker-machine --version | tr -ds ',' ' ' | awk 'NR==1{print $(3)}'` files=(docker-machine docker-machine-wrapper docker-machine-prompt) for file in "${files[@]}"; do curl -L https://raw.githubusercontent.com/docker/machine/v$machineVersion/contrib/completion/bash/$file.bash > /etc/bash_completion.d/$file done unset machineVersion
Observe que:
- Se você utilizar alguma versão específica de uma dessas ferramentas, basta baixar os arquivos da pasta correspondente. Por exemplo, o docker engine, da maneira que mostramos vamos pegar o arquivo que está na branch master, atualmente versão 1.12.1, para pegar na versão 1.11.0 por exemplo o arquivo fica em https://github.com/docker/docker/blob/v1.11.0/contrib/completion/bash/docker
- O Docker disponibiliza alguns arquivos de completion para outros shells. O Docker Engine disponibiliza bash, zsh,fish e powershell, como podemos ver em https://github.com/docker/docker/tree/master/contrib/completion .
- O Docker Compose e o Docker Machine disponibilizam apenas para bash e zsh, como vemos nas URLs: https://github.com/docker/compose/tree/master/contrib/completion e https://github.com/docker/machine/tree/master/contrib/completion .
E era isso por hoje, pessoal. Agradecimento especial ao @wsilva pela dica.
Abraço!