Você já precisou ver o que está acontecendo dentro de um container Docker? Os containers são destinados a serem idempotentes: se houver um problema, implemente um novo container. Muitas vezes a vida não é tão simples. Você precisa executar comandos no container para identificar o problema. É aqui que o comando docker exec
pode ajudar.
Este artigo irá ensinar como executar comandos em um container Docker em execução usando o comando docker exec
.
Pré-requisitos
Para seguir os exemplos deste artigo, você precisará seguir o seguinte.
- Qualquer versão recente do Docker Desktop funcionará no Windows, Linux ou macOS. Este tutorial usa a versão 3.1.0 executando no Windows 10.
Iniciando um container NGINX
O docker exec
executa comandos em containers. Mas, para fazer isso, você deve primeiro ter um container para executar esses comandos. Vamos começar baixando uma imagem Docker e criando um container de demonstração.
- Crie um novo diretório, este tutorial usa C:\gitrepos\test, para armazenar os arquivos usados para o container.
2. Crie um arquivo, nomeado dockerfile (sem extensão), contendo o seguinte código. O Dockerfile define as etapas necessárias para criar um contêiner.
3. Em seguida, crie um arquivo, no mesmo diretório, nomeado index.html que contém o seguinte código. Este é um arquivo HTML que, quando o contêiner for iniciado, exibirá uma mensagem de Olá Mundo.
4. Agora crie o contêiner Docker Nginx. Como o Dockerfile está no diretório atual de trabalho, especifique .
para informar ao mecanismo Docker para procurar lá. Além disso, não se esqueça de etiquetar o contêiner com my-nginx
usando o parâmetro t
para garantir uma referência mais fácil no futuro.

5. Agora que o contêiner foi construído, inicie o contêiner com o comando Docker run.

6. Finalmente, abra seu navegador da web e navegue até http://localhost/
para ver o seguinte.

Executando Comandos com Docker Exec
Ao executar comandos em um contêiner Docker, você pode precisar executar um comando de forma interativa. Executar comandos de forma interativa significa digitar um comando, receber feedback, digitar outro comando, etc. Os comandos interativos assumem o controle da sua sessão e impedem que você faça qualquer outra coisa.
Mas e se você já conhecer os comandos a serem enviados para o contêiner antecipadamente e quiser executar comandos em segundo plano? Nesse caso, você pode executar comandos não interativos. Comandos não interativos permitem que você envie um comando para o Docker e instantaneamente retome o controle do console.
Localizando o Nome e o ID do Contêiner
Agora que você construiu o contêiner, pode executar comandos dentro dele. Antes de executar um comando, localize o nome ou ID do contêiner NGINX. Tanto o nome quanto o ID funcionarão em comandos Docker. Com isso em mente, lembrar do ID pode ser mais desafiador do que o nome!
Para exibir informações de qualquer contêiner em execução, execute o comando Docker ps
para obter a seguinte informação.

Copie tanto o ID único, e17e4b6be01a
, quanto o nome gerado aleatoriamente mystifying_chandrasekhar
para a área de transferência para uso posterior.
Executando um Comando Não Interativo com o Docker Exec
Como exemplo de execução de um comando não interativo, copie e execute o comando abaixo para retornar uma lista de arquivos no diretório /var/log com o comando ls -l
. Passe tudo após o nome do contêiner, mystifying_chandrasekhar
, para o comando exec
do Docker.

Avoidando a Saída do Console com Comandos Docker
Ao devolver instantaneamente o controle do shell ao usuário, operações extensas evitam travar o console. Evite a saída no console com a opção destacada d
. O comando abaixo cria o arquivo /tmp/execFunciona por meio do comando touch
dentro do contêiner e não exibe nenhuma saída no console.
Executando Comandos Interativos com o Docker Exec
Até este ponto, você aprendeu como executar comandos não interativos em um contêiner Docker com docker exec
. No entanto, pode ocorrer uma situação em que você precise solucionar problemas em um contêiner, por exemplo, quando precisa emitir comandos para o contêiner de forma interativa. Nesse caso, é necessário executar comandos de forma interativa.
Executar comandos de forma interativa com docker exec
requer duas opções, i
e t
. A opção i
mantém o STDIN aberto, permitindo o envio de comandos para o contêiner, e a opção t
aloca um pseudo-TTY (PTY), um canal de comunicação, para digitar comandos.
Copie e cole o comando a seguir para abrir um prompt de comando interativo para o contêiner Docker em execução com o shell Bourne (sh), conforme indicado pela alteração do prompt para / #
.

Uma vez no shell, execute os comandos abaixo para demonstrar a listagem de arquivos de dentro do contêiner. Por fim, execute o comando exit
para sair do shell interativo.

Para abrir um prompt interativo em um diretório específico, passe o caminho para a opção
w
, indicando ao Docker para iniciar o shell em um diretório especificado.
Passando Variáveis Ambientais para um Contêiner em Execução
Muitos programas utilizam variáveis ambientais para configurar parâmetros durante a inicialização. Por exemplo, a maioria das aplicações Java requer que a variável ambiental JAVA_HOME
seja configurada com o caminho do Java.
Você pode passar variáveis ambientais para uma sessão usando a opção e
. Por exemplo, talvez seja necessário popular uma variável ambiental chamada MYVAR
em um contêiner em execução. Para fazer isso, utilize a opção e
e forneça o par chave/valor de MYVAR="<algum valor>"
, conforme mostrado abaixo.

Passando Variáveis Ambientais Com um Arquivo
Se você tiver muitas variáveis ambientais ou uma configuração compartilhada, armazenar essas variáveis em um arquivo pode ser mais fácil. Passe o arquivo via um caminho relativo ou absoluto para o Docker com a opção --env-file
. Essa técnica é frequentemente utilizada para fornecer credenciais seguras a um contêiner. Certifique-se de nunca commitar credenciais no controle de versão!
Crie um arquivo de texto chamado env-vars.txt
com as variáveis ambientais a serem passadas e seus valores. Esse arquivo pode ter qualquer nome que você preferir e não precisa da extensão .txt
.

Passe as variáveis ambientais para o Docker com a opção env-file
. Verifique se as variáveis estão disponíveis com o comando echo
, conforme mostrado na captura de tela abaixo.

Interagindo com um Contêiner em Execução como um Usuário Diferente
Na produção, as aplicações frequentemente são executadas como um usuário específico para restringir seu acesso. Se você estiver executando aplicações como um usuário específico na produção, também deverá fazê-lo ao testar comandos.
Neste exemplo, o contêiner Docker é executado como o usuário nginx
. Passe o usuário para a opção w
para informar ao Docker para iniciar o contêiner como a conta nginx
. O comando whoami
, executado de dentro do contêiner, confirma que o usuário nginx
está de fato sendo utilizado.

nginx
user.Próximos Passos
Você aprendeu como executar comandos dentro de um contêiner em execução usando o comando docker exec
. Utilizando o comando exec
para entrar e interrogar contêineres em execução, você tem uma ferramenta poderosa em seu arsenal para solucionar problemas com contêineres Docker.
Agora, tente levar o que aprendeu um passo adiante e use o controle de versão Git para puxar um site estático para dentro do contêiner, em vez de copiar um único arquivo. Se o Git for novo para você, então o artigo Um Guia Iniciante para Visual Studio Code e Git é um ótimo ponto de partida.