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

bernardolankheet
Jun 16 · 4 min read

É 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!!!


bernardolankheet

Written by

Bernardo Gomes Lankheet é graduado em Redes de Computadores pelo IFES, Pós Graduação em Segurança da Informação e apaixonado em compartilhar conhecimentos.

bernardolankheet

Written by

Bernardo Gomes Lankheet é graduado em Redes de Computadores pelo IFES, Pós Graduação em Segurança da Informação e apaixonado em compartilhar conhecimentos.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store