A -t
opção vai para como o Unix / Linux lida com o acesso ao terminal. No passado, um terminal era uma conexão direta, mais tarde uma conexão baseada em modem. Eles tinham drivers de dispositivos físicos (eram peças de equipamento reais). Depois que as redes generalizadas entraram em uso, um driver pseudo-terminal foi desenvolvido. Isso ocorre porque ele cria uma separação entre a compreensão de quais recursos do terminal podem ser usados sem a necessidade de gravá-lo diretamente no seu programa (leia as páginas de manual stty
, curses
).
Portanto, com isso como plano de fundo, execute um contêiner sem opções e, por padrão, você tem um fluxo stdout ( docker run | <cmd>
funciona); executar com -i
, e você adiciona o fluxo stdin (assim <cmd> | docker run -i
funciona); use -t
, geralmente na combinação -it
e você tenha um driver de terminal adicionado, que, se você estiver interagindo com o processo, provavelmente será o que deseja. Basicamente, faz o início do contêiner parecer uma sessão de conexão de terminal.
-it
bandeiras.docker run -i ubuntu
edocker run -it ubuntu
você verá a diferença imediatamente. "-i" permite que o contêiner aguarde a interação do host, mas a interação real do console (terminal) é possível após "alocar o driver tty" com o sinalizador "-t".-t
, mas não consigo modificar o comando docker start em produção. Então, preciso fazer com que o aplicativo pense que foi iniciado-t
.Resposta tardia, mas pode ajudar alguém
docker run/exec -i
conectará o STDIN do comando dentro do contêiner ao STDIN dodocker 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 principalcat
está aguardando a entrada do fluxo infinito que é a entrada do terminaldocker run
.echo "hello" | docker run -i alpine cat
, imprimirá "olá" e sairá imediatamente, porquecat
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 enquantocat
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 decat
.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á ocat
contêiner ainda em execução. Isso ocorre porquecat
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 dadocker run
qual é um terminal.docker run/exec
garantirá que sua própria entrada seja de fato um tty antes de passá-la paracat
. É por isso que você obterá uminput device is not a TTY
se tentar,echo "hello" | docker run -it alpine cat
porque nesse caso, a entrada emdocker run
si é o canal do eco anterior e não o terminal ondedocker run
é executadoFinalmente, 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 exemplodocker 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 comols
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 comoshell
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.fonte
-t
e as-i
opções fazem!O
-t
argumento NÃO é bem documentado ou mencionado por muitas pessoas, de acordo com uma pesquisa no Google.Ele nem aparece quando você exibe uma lista de (o que deveria ser) todos os argumentos do cliente docker digitando
docker
no prompt do Bash (com a versão mais recente do 1.8.1).De fato, se você tentar obter ajuda específica sobre esse argumento, digitar
docker -t --help
if fornece uma resposta incrivelmente vaga:Portanto, você não pode ser responsabilizado por estar confuso com esse argumento!
Há uma menção na documentação online do Docker que diz que é "Alocar um pseudo-tty" e é frequentemente usado com
-i
:https://docs.docker.com/reference/run/
Vi-o usado na documentação para o fantástico
jwilder/nginx-proxy
container docker da seguinte maneira:Nesse caso, o que ele faz é enviar a saída para o tty 'virtual' (prompt de comando do Bash / terminal) dentro desse contêiner do docker. Você pode ver essa saída executando o comando docker,
docker logs CONTAINER
ondeCONTAINER
estão os primeiros caracteres do ID desse contêiner. Esse ID do CONTAINER pode ser encontrado digitando-sedocker ps -a
Eu vi esse
-t
argumento mencionado brevemente no link a seguir, onde dizhttps://coreos.com/os/docs/latest/getting-started-with-docker.html
Eu espero que isso ajude! Não sei por que isso não é documentado ou usado muito. Talvez seja experimental e seja implementado como um recurso documentado nas próximas versões.
fonte
docker run --help
, nãodocker -t --help
:-t, --tty=false Allocate a pseudo-TTY
"O que eu sei sobre o
-t
é o seguinte:docker exec -ti CONTAINER bash
- permite-me "entrar" no contêiner. Parece ssh-ing (não é).Mas o problema foi quando eu queria restaurar um banco de dados.
Normalmente eu faço
docker exec -ti mysql.5.7 mysql
- aqui eu executo o comando mysql no container e obtenho um terminal interativo.Eu adicionei
<dump.sql
ao comando anterior para restaurar um banco de dados. Mas falhoucannot enable tty mode on non tty input
.Removendo o
-t
ajudado. Ainda não entendo o porquê:O último funciona. Espero que isso ajude as pessoas.
fonte
-t
, mas não consigo modificar o comando docker start em produção. Então, preciso fazer com que o aplicativo pense que foi iniciado-t
.No Linux, quando você executa um comando, você precisa de um terminal (tty) para executá-lo.
Portanto, quando você deseja se conectar à janela de encaixe (ou executar o comando no contêiner de estação de encaixe), precisará fornecer a opção -t, que leva em consideração o terminal dentro do contêiner de estação de encaixe.
fonte
Todo processo tem três fluxos de dados, ou seja
STDIN/ STDOUT/ STDERR
. Quando um processo está em execução em um contêiner, por padrão, o terminal é conectado ao fluxo STDOUT do processo em execução no contêiner. Portanto, todos os fluxos de saída serão visíveis durante a execução dodocker run
comando no terminal. Mas se você deseja fornecer entrada para o processo em execução no contêiner, é necessário conectar-se ao canal STDIN do processo que não é por padrão e é feito com odocker run -i
comando-t
é usado para operações de entrada interativas / formatadas.fonte
Ele
-it
instrui o Docker a alocar um pseudo-TTY conectado ao stdin do contêiner, criando um shell bash interativo no contêiner.--interactive
,-i
false
Mantenha STDIN abrir mesmo que não seja anexado--tty
,-t
false
Aloque um pseudo-TTYhttps://docs.docker.com/engine/reference/commandline/run/
fonte