DevSecOps

10 out, 2016

Auto Complete para Docker

Publicidade

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:

  1. 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
  2. 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 .
  3. 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!