O que significa “o dispositivo de entrada não é um TTY” significa exatamente na saída “docker run”?

4

Este é um comando que funciona:

$ echo 'hi there' | docker run -i ubuntu cat
hi there

Este é um comando que responde com uma mensagem de erro:

$ echo 'hi there' | docker run -it ubuntu cat
the input device is not a TTY

Eu gostaria de descobrir exatamente o que acontece aqui. Não apenas "remover -t e isso será corrigido".

Eu sei que a opção docker run do -t significa "Alocar um pseudo-TTY", e eu li visões gerais históricas do que o TTY representa , mas isso não me ajudou a entender que tipo de contrato é violado aqui.

    
por Mike 19.02.2018 / 13:40

2 respostas

3

Um tty indica que você tem um terminal, algo que seria fornecido pelo xterm ou por uma das muitas interfaces de linha de comando do Linux. Ele precisa de uma interface de saída de teclado e texto associada a ele. Razões típicas para isso são para suporte a saída de texto colorido, manuseio de várias combinações de teclas (como as teclas de seta) e a capacidade de mover o cursor pela tela.

Quando você canaliza um comando para o docker como mostra o seu echo example, esse pipe é a entrada, e esse pipe não tem uma interface tty, é apenas um fluxo de texto. A tentativa de criar um tty com isso falhará conforme a mensagem de erro indicar.

    
por 19.02.2018 / 13:56
2

Esta resposta ajudou-me a pensar:

  • por padrão (sem as opções -i nem -t ), um contêiner Docker envia somente sua saída para STDOUT,
  • com a opção -i vem a conexão com STDIN,
  • A opção -t obtém um driver de interface de terminal , que funciona na parte superior de STDIN / STDOUT. E quando um driver de terminal é enviado, a comunicação com um contêiner deve estar de acordo com o protocolo de interface de terminal . Piping uma string não.
por 19.02.2018 / 16:49