o que é docker run -it flag?

108

Eu estava fazendo algumas coisas complexas com o docker, mas não sei o que -itflag significa. Recentemente, descobri um exemplo de docker runcomando que me confundiu um pouco.

docker run -itd ubuntu:xenial /bin/bash 

Minha pergunta é qual é o sentido de escrever -itsinalizador aqui, se o contêiner durante a instanciação executarbin/bash

Na documentação, temos um exemplo

docker run --name test -it debian

com explicação

O -it instrui o Docker a alocar um pseudo-TTY conectado ao stdin do contêiner; criando um shell bash interativo no contêiner.

e explicação para -t sinalizador da página de ajuda

-t, --tty Aloca um pseudo-TTY

se eu deletar -it sinalizador durante

docker run -d ubuntu:xenial /bin/bash

meu contêiner recém-criado não vive muito

no docker ps -a

é designado como encerrado

Desculpe, se minha pergunta é bastante estúpida, não consigo encontrar explicação na Internet (tenho um mal-entendido significativo sobre esse ponto).

Alex
fonte
Se /bin/bashnão tiver conteúdo disponível em stdin, ele não terá comandos para executar e nenhuma maneira de avisar o usuário, então ele sai. Este é um comportamento 100% normal e esperado.
Charles Duffy

Respostas:

97

-ité a abreviatura de --interactive + --ttyquando você docker runcom este comando .. levaria você direto para dentro do contêiner ,, onde -dé a abreviação de --detachque significa que você apenas executa o contêiner e, em seguida, desanexa -o, então basicamente você executa o contêiner em segundo plano .. edit: so se você executar o docker container com -itdele, as -itopções serão executadas e você será desconectado do container, de forma que seu container ainda seja executado em segundo plano, mesmo sem nenhum aplicativo padrão para ser executado.

Fendi jatmiko
fonte
Não é a resposta certa, porque meu contêiner é interrompido após ser executado sem a opção -it.
Alex
1
isso significa que há um erro em seu contêiner .. então seu contêiner falhou ao iniciar ... ou talvez ele não tivesse nenhum CMDcomando por padrão, então ele não executou nenhum aplicativo por padrão. .assim, se você executá-lo em segundo plano, ele será encerrado imediatamente porque não há nenhuma tarefa a ser executada. .
Fendi jatmiko
@Alex, se o programa em seu contêiner é algo que sai quando o stdin é fechado, aí está sua resposta (por que ele não funciona sem -i). Da mesma forma, se ele executa comandos que se comportam de maneira diferente com base na existência de um TTY, você pode obter um comportamento distinto dependendo da presença de -t.
Charles Duffy
@Alex, ... e para ser claro, também /bin/bash </dev/nullsai imediatamente, se você executá-lo sem o Docker. Correr docker runsem -ié fazer a mesma coisa com a cópia bashdaquele que inicia. (Sem -t, ele tem um stdin, mas não um TTY, então ele não se detecta como um shell interativo, então você obtém um conjunto ligeiramente diferente de comportamentos).
Charles Duffy
1
@AdmiralAdama, o que corrige o problema de cor é a opção -t. O TTY é necessário para compreender os tokens de cor.
kroiz
42

docker run -it ubuntu:xenial /bin/bashinicia o contêiner no modo interativo (portanto, -itsinalizador) que permite que você interaja com /bin/basho contêiner. Isso significa que agora você vai ter bashsessão dentro do recipiente, para que você possa ls, mkdirou fazer qualquer comando bash dentro do recipiente.

A chave aqui é a palavra "interativo". Se você omitir o sinalizador, o contêiner ainda será executado, /bin/bashmas será encerrado imediatamente. Com o sinalizador, o contêiner é executado e, em /bin/bashseguida, espera pacientemente por sua entrada.

dvnguyen
fonte
1
para o que eu preciso usar o sinalizador -t então? docker run -i ubuntu:xenial /bin/bash
Alex
3
-t: pseudo tty ou "pseudo terminal". Sem um terminal, você não pode enviar entradas para o contêiner.
dvnguyen
docker run -it ubuntu:xenial obrigado pela resposta, mas terei uma sessão de terminal com este comando do zero também (para o que eu preciso para executar bin / bash então). Ele também cria uma sessão de terminal
Alex
1
Você está certo. Vou retirar minhas palavras. Sem -ttag, ainda é possível interagir com o contêiner, mas com ele você terá um terminal mais agradável e com mais recursos. Você pode correr com -ie -itpara ver a diferença.
dvnguyen
Não consigo encontrar nenhuma diferença. Obrigado por seus esforços!
Alex