Conteúdo

Tutorial do docker exec: execute comandos em contêineres em execução

docker exec executa comandos dentro de um contêiner em execução e é mais usado para acessá-lo e investigar problemas. Veja o fluxo completo de depuração em Ver logs e depurar.

Sintaxe

docker exec [opções] contêiner comando [argumentos...]
docker exec -it web sh        # acessa o shell do contêiner
docker exec web nginx -t      # executa um comando e mostra o resultado

Opções

docker exec tem poucas opções. Veja todas as opções listadas por docker exec --help:

OpçãoDescrição
-i, --interactiveMantém a entrada padrão aberta para que você possa digitar
-t, --ttyAloca um terminal. Para interação, use junto com -i: -it
-u, --user usuário[:grupo]Executa como o usuário especificado (nome ou UID)
-w, --workdir caminhoExecuta no diretório especificado dentro do contêiner
-e, --env nome=valorDefine uma variável de ambiente para esta execução
--env-file arquivoLê variáveis de ambiente de um arquivo
-d, --detachExecuta em segundo plano e retorna imediatamente
--privilegedConcede permissões extras a este comando (para depuração; não use normalmente)
--detach-keysAltera o atalho para sair (padrão Ctrl+P, Ctrl+Q)

Todos os exemplos a seguir são executados em um contêiner nginx chamado web, iniciado com a variável de ambiente APP_MODE=demo:

docker run -d --name web -e APP_MODE=demo nginx:1.30-alpine

Executar um comando

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web sh -c "ls /etc/nginx/conf.d && echo \$APP_MODE"
default.conf
demo
  • O primeiro comando executa nginx -v no contêiner e mostra o resultado diretamente.
  • Para usar &&, pipes ou variáveis, passe o comando para o shell dentro do contêiner com sh -c "...". Em \$APP_MODE, \ impede que o shell do host substitua a variável primeiro. demo é o valor dentro do contêiner.

Acessar o contêiner de forma interativa

docker exec -it web sh

Depois de entrar, o prompt muda para / #. Você pode trabalhar como em um Linux comum. Digite exit para sair; o contêiner não será parado. Se a imagem tiver bash, você também pode usar bash.

-u, -w, -e

$ docker exec -u nginx web id
uid=101(nginx) gid=101(nginx) groups=101(nginx)

$ docker exec -w /usr/share/nginx/html web ls
50x.html
index.html

$ docker exec -e GREETING=hi web sh -c "echo \$GREETING"
hi
  • -u nginx: executa como o usuário nginx (o padrão do contêiner é root). É útil para investigar problemas de permissões de arquivos.
  • -w /usr/share/nginx/html: executa no diretório especificado, como se você tivesse usado cd antes.
  • -e GREETING=hi: define uma variável de ambiente apenas para esta execução, sem alterar o contêiner.

-d: executar em segundo plano

$ docker exec -d web sh -c "sleep 2; touch /tmp/done"

$ docker exec web ls /tmp
done

-d executa o comando em segundo plano e retorna imediatamente. Depois de 2 segundos, confira: /tmp/done foi criado. É útil para iniciar tarefas cujo resultado você não precisa aguardar.

O contêiner não está em execução

$ docker stop web
web

$ docker exec web ls
Error response from daemon: container 1ec4fdc5c592b09b64e8f28869c37f89ab17163f88bfcb09e82815a44b0e1164 is not running

docker exec só funciona em contêineres em execução. Para usar um contêiner parado, primeiro execute docker start. Se o contêiner sair assim que iniciar, você também não conseguirá acessá-lo com exec. Nesse caso, consulte docker logs ou inicie um novo contêiner para investigar com docker run --rm -it --entrypoint sh imagem.

Capítulos relacionados

Exercícios

Exercício: com um único comando, liste os arquivos no diretório /etc/nginx do contêiner web como usuário nginx.

Resposta
docker exec -u nginx -w /etc/nginx web ls

Perguntas frequentes

Qual é a diferença entre docker exec e docker run?

docker run usa uma imagem para **criar um novo contêiner**; docker exec executa mais um processo em um **contêiner que já está em execução**. Quando exec termina, o contêiner em si não é afetado.

docker exec -it contêiner bash mostra executable file not found?

O contêiner não tem bash. Por exemplo, imagens baseadas em Alpine têm apenas sh. Use docker exec -it contêiner sh.

Os arquivos alterados dentro do contêiner continuam lá depois que ele é recriado?

Não. As alterações feitas com exec ficam na camada gravável do contêiner e desaparecem quando ele é removido. Grave as alterações que precisam ser preservadas no Dockerfile ou em um Volume.

Atualizado 14 de outubro de 2026