Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Por que não consigo abrir um terminal com o comando $ docker start -ia ?

Olá pessoal, após realizar alguns testes aqui com o docker, fiquei com a seguinte dúvida.

Quando eu subo um container "ubuntu" informando a flag -it e depois paro o mesmo, consigo levantar o container novamente com o comando $ docker start -ai "id do container" e um terminal é aberto para eu poder interagir. Entretanto, quando eu faço o mesmo com uma imagem "nginx", não consigo realizar o mesmo procedimento. Quando rodo o mesmo comando, o terminal fica preso na execução do container. Só consigo abrir um terminal dentro do container nginx com o comando $ docker exec -it "id do container" bash . Utilizei o seguinte comando para levantar esse container nginx:

$ docker run -d -it -p 8080:80 --name meu-nginx nginx

Gostaria de saber se isso é um comportamento normal, ou se fiz algo de errado.

Grato pela atenção!

6 respostas

Olá, Tiago. Beleza?

Esse é o comportamento padrão. O container do nginx tem como ponto de entrada a execução do processo do próprio nginx. Quando você usa o -a para fazer o attach, você irá entrar no container como ele é na execução do seu ponto de entrada. Então é normal, caso você queira acesso ao Bash, ter que fazer isso passando especificamente qual comando você quer executar naquele container com exec.

O Ubuntu, como é a imagem do sistema operacional em si, tem o Bash como seu entry point. Imagens diferentes possuem pontos de entrada diferentes.

Espero ter ajudado. Se tiver alguma dúvida, é só dizer.

Show Vitor! Deixa ver se eu entendi... Para eu poder usar o comando docker start -ai "container", em um container qualquer, o mesmo deve obrigatoriamente ter sido gerado através de uma imagem que foi criada a partir de um arquivo "Dockerfile" que possuia o parâmetro "ENTRYPOINT" configurado para executar o bash? Caso contrário eu precisarei sempre usar o "exec" para me conectar ao terminal do container. Seria isso?

Oi, Tiago.

Não é bem assim.

Primeiramente, não é necessário que no Dockerfile tenha sido definido um entry-point com o Bash para que você possa interagir com o container. O Bash é apenas um programa que pode nem mesmo existir num container a depender de como ele foi projetado.

Quando você usa a opção -i você está dizendo que quer ter interação com o container. No modo interativo você pode passar uma entrada e receber respostas se essa entrada puder ser interpretada.

No caso do container do nginx, por exemplo, o entry-point é a execução do próprio programa nginx. Se você usar o -i nele, você será mandado para o container no estado em que ele está operando, que é o nginx em execução. Você vai poder escrever alguma coisa lá, mas nada acontece, porque não tem como ser interpretado. Igual quando você executa um programa no Bash e esse programa não te permite executar outras coisas, pois ele não foi feito para interagir.

Quando você usa o exec, você passa para o Docker que você quer executar um programa contido naquele container. Se o container tiver sido construído com aquele programa, você vai ser mandado para o container com esse programa em execução. No caso do Bash, quando executado, ele te dá um prompt para que você possa passar comandos, ser interpretado por ele e executado.

Eu poderia, por exemplo, criar um container baseado no Ubuntu, desinstalar o Bash, instalar o nginx e definir que o entry-point dele é o próprio nginx. Dessa forma, mesmo sendo Ubuntu, se você usar o docker start -ai não teria um Bash em execução, mas sim o nginx.

Espero que tenha te ajudado a entender. Se tiver dúvida, é só dizer.

Olá Vitor, acho que entendi.

Talvez eu esteja confundindo a opção -i, que pelo que entendi não necessariamente se trata de um terminal, vai depender do programa que estiver rodando e definido no entry-point, conforme você explicou. E no caso do comando "docker exec -it" eu preciso passar o programa que desejo executar dentro daquele container específico (e dentro de um terminal - tty), que no meu caso seria o bash. Seria isso?

solução!

Oi, Tiago.

Isso mesmo. Se o programa que você quer executar estiver presente, ele será executado. Mas só funciona se o container tiver sido iniciado com o -i que aí ele deixará uma interface para interação disponível. Se você passar o -t, ele vai te dar um prompt, mostrando o usuário e a localização, como acontece normalmente no Linux.

Maravilha, Vitor! Agora as coisas estão clareando por aqui.. Muito obrigado pelos esclarecimentos!