Resposta tardia, mas pode ajudar alguém
docker run/exec -i
conectará o STDIN do comando dentro do contêiner ao STDIN do docker run/exec
próprio.
assim
docker run -i alpine cat
fornece uma linha vazia aguardando entrada. Digite "olá" para obter um eco "olá". O contêiner não sairá até que você envie CTRL+ Dporque o processo principal cat
está aguardando a entrada do fluxo infinito que é a entrada do terminal docker run
.
- Por outro lado
echo "hello" | docker run -i alpine cat
, imprimirá "olá" e sairá imediatamente, porque cat
percebe que o fluxo de entrada terminou e termina automaticamente .
Se você tentar docker ps
depois de sair de qualquer um dos itens acima, não encontrará nenhum contêiner em execução. Nos dois casos, cat
ele próprio foi finalizado, portanto, a janela de encaixe finalizou o contêiner.
Agora, para "-t", isso informa ao processo principal dentro da janela de encaixe que sua entrada é um dispositivo terminal.
assim
docker run -t alpine cat
fornecerá uma linha vazia, mas se você tentar digitar "olá", não receberá eco. Isso ocorre porque enquanto cat
estiver conectado a uma entrada do terminal, essa entrada não estará conectada à sua entrada. O "olá" que você digitou não atingiu a entrada de cat
. cat
está aguardando uma entrada que nunca chega.
echo "hello" | docker run -t alpine cat
também fornecerá uma linha vazia e não sairá do contêiner CTRL- Dmas você não receberá um "alô" de eco porque não passou-i
Se você enviar CTRL+ C, recuperará seu shell, mas se tentar docker ps
agora, verá o cat
contêiner ainda em execução. Isso ocorre porque cat
ainda está aguardando um fluxo de entrada que nunca foi fechado. Eu não encontrei nenhum uso útil para o -t
sozinho, sem ser combinado com -i
.
Agora, -it
juntos. Isso informa ao gato que sua entrada é um terminal e, ao mesmo tempo, conecta esse terminal à entrada da docker run
qual é um terminal. docker run/exec
garantirá que sua própria entrada seja de fato um tty antes de passá-la para cat
. É por isso que você obterá um input device is not a TTY
se tentar, echo "hello" | docker run -it alpine cat
porque nesse caso, a entrada em docker run
si é o canal do eco anterior e não o terminal onde docker run
é executado
Finalmente, por que você precisaria aprovar -t
se -i
fará o truque de conectar sua entrada à cat
entrada de? Isso ocorre porque os comandos tratam a entrada de maneira diferente se for um terminal. Isso também é melhor ilustrado pelo exemplo
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -u root -p
fornecerá uma solicitação de senha. Se você digitar a senha, os caracteres serão impressos visivelmente.
docker run -i alpine sh
lhe dará uma linha vazia. Se você digitar um comando como ls
você obtém uma saída, mas não receberá uma saída rápida ou colorida.
Nos dois últimos casos, você tem esse comportamento porque mysql
, assim como shell
não estavam tratando a entrada como um tty e, portanto, não utilizar tty comportamento específico como mascarar a entrada ou colorir a saída.
-it
bandeiras.