05 - Como executar comandos dentro do Docker (Docker Exec)

bernardolankheet
4 min readJun 16, 2020

É 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 NAMES
2f92e332b379 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!!!

--

--