Já viu a mensagem “the input device is not a TTY” ?
Talvez você já tenha se deparado, ou esteja passando agora pelo seguinte erro ao tentar executar um comando em sua pipeline:
the input device is not a TTY
Mas o que significa isso?
De forma bem simples, podemos dizer que TTY é um sinônimo de terminal, ou seja, um ambiente com entrada e saída de texto (e até mesmo outra interações como movimentar o cursor), de forma que o usuário consiga interagir com a máquina.
Sabendo disso fica fácil interpretar o erro! Ele está simplesmente reclamando que estamos tentando interagir com uma interface que não é um TTY, isto porque, provavelmente, a pipeline em que o comando está sendo executado não possui uma interface interativa alocada por padrão.
Por que isso acontece?
Provavelmente o comando executado está configurado como interativo, o exemplo mais comum disso é a flag -it ou -ti, comumente utilizada em comandos docker:
docker exec -it containername
docker run --rm -ti ubuntu:16.04
Sendo que, a flag -i por si só entra no modo interativo, mesmo sem necessariamente ter um console. Já a tag -t aloca um pseudo TTY! Opa, exatamente o que precisamos, não é? Vamos ver melhor isso abaixo…
Soluções
Para solucionar o problema basta remover a tag -it, simples assim… 😄
Também podemos utilizar apenas a opção -t no comando, que como vimos acima, aloca um pseudo TTY, porém isso não é necessário, pois o docker já faz isso debaixo dos panos pra gente.
⚠️ IMPORTANTE: o -t é uma opção válida apenas para comandos docker, se você estiver utilizando um comando docker-compose vai precisar utilizar o -T (maiúsculo): docker-compose exec -T mysql
Mas pera aí né, essa é a forma elegante e recomendada, mas como se sabe nem sempre a vida real é favorável para seguir as recomendações, por isso se não for possível editar o comando e ele tiver que ser executado com a flag interativa mesmo podemos tentar a seguinte g̶a̶m̶b̶i̶a̶r̶r̶a solução paliativa:
Nesse exemplo estava utilizando o GitHub Actions para executar minha pipeline; então adicionei o seguinte script: shell: ‘script -q -e -c “bash {0}”’ antes de executar o comando docker que eu queria em si, essa linha realiza um reload com o shell bash forçando um pseudo TTY por cima da interatividade do docker, na prática ficou assim:
Se você chegou até aqui, espero ter te ajudado de alguma forma! Ficou com alguma dúvida ou tem algo à acrescentar? comenta aí! Até outra hora!