05 - Como executar comandos dentro do Docker (Docker Exec)
É muito comum precisarmos executar rotinas ou comandos dentro dos containers. Para isso existe um utilitário no daemon do docker, que facilita qualquer execução de comandos quando precisamos, chamado docker exec.
O comando exec possui a seguinte sintax.
docker exec <options> <container> <command>
Precisamos inicialmente identificar a ID ou nome do container, para isso, basta utilizar o commando “docker ps” ou “docker container ls”
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2f92e332b379 debian "/bin/bash" 4 days ago Up 4 days keen_jepsen
Na primeira coluna é identificado a ID do container e na ultima o seu nome. (Obs: quando não definimos um nome para um container, usando a opção –name no momento da criação, é gerado aleatoriamente um nome)
Agora realize um teste para visualizar os diretórios dentro deste container.
docker exec 2f92e332b379 lsbin
boot
dev
etc
home
ldc
lib
Agora já estamos familiarizados com o “docker exec”, podemos nos aprofundar um pouco mais.
Capturando Shell (bash) a partir de containers em execução.
Pode ocorrer de precisamos debugar algum caso, fazer uma alteração simples em um container que já está sendo executado. Nessa anotação mostro como isso é possível.
Antes de tudo, verifique os containers em execução.
docker container ls ou docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES941e03aa64cd bernardolankheet/grafana "/run.sh" 4 minutes ago Up 4 minutes 0.0.0.0:3000->3000/tcp grafana_bernardo
Para capturar um shell de um container em execução, na coluna NAMES, verifica o nome do container que deseja realizar a operação. Nesse meu exemplo acima, o nome do container é “grafana_bernardo”. Para obter o shell deste container basta utilizar a opção exec dentro de container.
docker container exec -it grafana_bernardo /bin/bashbash-5.0$
Há a opção de utilizar a ID do container também, na saída do ls ou os, é a primeira coluna.
docker container exec -it 941e03aa64cd /bin/bashbash-5.0$
Para sair do bash do container quando terminar, basta digitar “exit”.
Utilizamos aqui uma função que não havia citado antes, a opção –it, que mostra que utilizará uma função interativa. Onde será utilizado STDIN, STDOUT e STDERR (chamada de entrada, chamada de saída e chamada de erro respectivamente), então o daemon do docker conseguirá capturar o bash do container, enviar comandos e apresentar o resultado do mesmo.
Quando não especificar a opção “-it”, o bash ainda será executado no container, mas você não conseguirá interagir com o console.
Docker exec com usuário root ou um usuário específico
Temos alguns casos que é necessário executar rotinas ou script com o usuário root. Para isso, podemos usar a opção “-u 0”, onde 0 é a ID do usuário root. Para descobrir as ID dos usuários, basta executar id no console.
id
uid=0(root) gid=0(root) groups=0(root)
Executa o comando whoami dentro do container para verificar qual usuário está conectado.
docker exec -u 0 -it 2f92e332b379 whoamiroot
Executando múltiplos comandos em um container ou em um diretório especifico
Para executar vários comandos de uma vez, podemos usar a opção “–c”, onde o comando será lido como uma string.
docker exec <id/nomecontainer> bash -c "comando1 ; comando2 ; comando3"
Como exemplo podemos verificar um conteúdo de um arquivo em um diretório especifico, podemos utilizar o cd para navegar até o diretório e depois o cat junto com o grep para ler o arquivo e apresentar a informação.
docker exec 2f92e332b379 bash -c "cd ~/.config/onedrive; cat config | grep sync_dir"sync_dir = "~/OneDrive"
Caso deseja executar em um diretório especifico. Podemos utilizar a opção “–w”
docker exec -w /caminho/do/diretorio <container> <comando>
Seguindo o último exemplo, podemos executar da seguinte forma:
docker exec -w ~/.config/onedrive 2f92e332b379 cat config
Diferença entre “docker run –it” e “docker exec –it”
Por último temos uma diferença entre “docker run –it“ e “docker exec –it”, até este ponto vimos várias maneiras de utilizar o docker exec, mas Achei importante pontuar e mostrar o docker run.
As vezes precisamos apenas testar um script ou executar alguma função de maneira rápida, para isso podemos utilizar o docker run -it, ele inicia um container temporário apenas para realizar a tarefa desejada, apenas finalizar, o container é removido.
Podemos verificar o exemplo abaixo, o contêiner que continua em execução tem uma ID diferente do que executamos com o docker run.
docker run -it debian bashroot@a5d53a29ef8e:/# exitexitPS D:\ > docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2f92e332b379 debian "/bin/bash" 4 days ago Up 4 days keen_jepsen
Mas ainda podemos acessar normalmente o container que está sendo executado utilizando o docker exec.
docker exec -it 2f92e332b379 bashroot@2f92e332b379:/#
Concluindo….. até neste ponto, conseguimos aprender sobre o Docker Exec, comando que acabamos usando com bastante frequência para debug ou tarefas rotineiras em containers.
Ate breve!!!