Docker Exec: Seu Comando Padrão para Executar Comandos no Docker


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.

  1. 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.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

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.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

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.

docker build -t my-nginx .
Creating a Docker container with the build command.

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

# rm - Informa ao Docker para deletar o contêiner após ele ter sido parado 
# d - Retorna o controle da linha de comando após o comando ter sido executado 
# p - Mapeia a porta interna do contêiner 80 para uma porta externa 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

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

Output of the running NGINX container.

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.

docker ps
Displaying running Docker containers.

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.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

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.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

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 / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

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.

ls -l /var/log
exit
Open an interactive command prompt to the container.

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.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

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.

Text file with environmental variables defined.

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.

# Passe o arquivo env-vars.txt e abra um prompt interativo
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verifique se as variáveis ambientais estão disponíveis no contêiner Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

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.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the 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.

Source:
https://adamtheautomator.com/docker-exec/