Resposta tardia, mas pode ajudar alguém
docker run/exec -iconectará o STDIN do comando dentro do contêiner ao STDIN do docker run/execpróprio.
assim
docker run -i alpine catfornece 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 catestá 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 catpercebe que o fluxo de entrada terminou e termina automaticamente .
Se você tentar docker psdepois de sair de qualquer um dos itens acima, não encontrará nenhum contêiner em execução. Nos dois casos, catele 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 catfornecerá uma linha vazia, mas se você tentar digitar "olá", não receberá eco. Isso ocorre porque enquanto catestiver 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. catestá aguardando uma entrada que nunca chega.
echo "hello" | docker run -t alpine cattambé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 psagora, verá o catcontêiner ainda em execução. Isso ocorre porque catainda está aguardando um fluxo de entrada que nunca foi fechado. Eu não encontrei nenhum uso útil para o -tsozinho, sem ser combinado com -i.
Agora, -itjuntos. Isso informa ao gato que sua entrada é um terminal e, ao mesmo tempo, conecta esse terminal à entrada da docker runqual é um terminal. docker run/execgarantirá 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 TTYse tentar, echo "hello" | docker run -it alpine catporque nesse caso, a entrada em docker runsi é o canal do eco anterior e não o terminal onde docker runé executado
Finalmente, por que você precisaria aprovar -tse -ifará o truque de conectar sua entrada à catentrada 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 -pfornecerá uma solicitação de senha. Se você digitar a senha, os caracteres serão impressos visivelmente.
docker run -i alpine shlhe dará uma linha vazia. Se você digitar um comando como lsvocê 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 shellnã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.
-itbandeiras.