¿Qué significa exactamente "el dispositivo de entrada no es un TTY" en la salida "ejecución de la ventana acoplable"?

¿Qué significa exactamente "el dispositivo de entrada no es un TTY" en la salida "ejecución de la ventana acoplable"?

Este es un comando que funciona:

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

Este es un comando que responde con un mensaje de error:

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

Me gustaría saber exactamente qué sucede aquí. No solo "elimine -t y se arreglará".

Sé que docker runla -topción significa "Asignar un pseudo-TTY" y he leídoresúmenes históricos de lo que significa TTY, pero no me ayudó a entender qué tipo de contrato se viola aquí.

Respuesta1

Respuesta tardía, pero podría ayudar a alguien.

docker run/exec -iconectará el STDIN del comando dentro del contenedor al STDIN del docker run/execmismo.

Entonces

  • docker run -i alpine catle da una línea vacía esperando entrada. Escribe "hola" y obtendrás un eco "hola". El contenedor no saldrá hasta que envíe CTRL+D porque el proceso principal catestá esperando la entrada del flujo infinito que es la entrada terminal del archivo docker run.
  • Por otro lado, echo "hello" | docker run -i alpine catimprimirá "hola" y saldrá inmediatamente porque catnota que el flujo de entrada ha finalizado y termina solo.

Si lo intenta docker psdespués de salir de cualquiera de las opciones anteriores, no encontrará ningún contenedor en ejecución. En ambos casos, catél mismo ha terminado, por lo que Docker ha terminado el contenedor.

Ahora, para "-t", esto le dice al proceso principal dentro de la ventana acoplable que su entrada es un dispositivo terminal.

Entonces

  • docker run -t alpine catle dará una línea vacía, pero si intenta escribir "hola", no obtendrá ningún eco. Esto se debe a que mientras catestá conectado a una entrada de terminal, esta entrada no está conectada a su entrada. El "hola" que escribiste no llegó a la entrada de cat. catEstá esperando una entrada que nunca llega.
  • echo "hello" | docker run -t alpine catTambién le dará una línea vacía y no saldrá del contenedor con CTRL-D, pero no recibirá un eco de "hola" porque no pasó.-i

Si envía CTRL+C, recuperará su shell, pero si lo intenta docker psahora, verá que el catcontenedor aún se está ejecutando. Esto se debe a que cattodavía está esperando un flujo de entrada que nunca se cerró. No he encontrado ningún uso útil para el -tsolo sin combinarlo -i.

Ahora, -itjuntos. Esto le dice a cat que su entrada es un terminal y al mismo tiempo conecta este terminal a docker runcuya entrada es un terminal. docker run/execse asegurará de que su propia entrada sea de hecho un tty antes de pasarla a cat. Es por eso que obtendrás un input device is not a TTYsi lo intentas echo "hello" | docker run -it alpine catporque en este caso, la entrada en docker runsí misma es la tubería del eco anterior y no la terminal donde docker runse ejecuta.

Finalmente, ¿por qué necesitarías pasar -tif -ihará el truco de conectar tu entrada a catla entrada? Esto se debe a que los comandos tratan la entrada de manera diferente si es una terminal. Esto también se ilustra mejor con el ejemplo.

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -ple pedirá una contraseña. Si escribe la contraseña, los caracteres se imprimen visiblemente.
  • docker run -i alpine shle dará una línea vacía. Si escribe un comando como lseste, obtendrá un resultado, pero no obtendrá un mensaje ni un resultado coloreado.

En los dos últimos casos, obtiene este comportamiento porque mysqlademás shellno tratamos la entrada como un tty y, por lo tanto, no utilizamos un comportamiento específico de tty como enmascarar la entrada o colorear la salida.

Respuesta2

esta respuestame ayudó a entender:

  • de forma predeterminada (sin -ini -topciones), un contenedor Docker solo envía su salida a STDOUT,
  • con -iopción viene conexión a STDIN,
  • -tLa opción incorpora un controlador de interfaz de terminal., que funciona encima de STDIN/STDOUT. Y cuando se detiene a un conductor de terminal, la comunicación con un contenedor debe ajustarse a lasprotocolo de interfaz terminal. Colocar una cuerda no.

Respuesta3

Un tty indica que tiene una terminal, algo que sería proporcionado por xterm o una de las muchas interfaces de línea de comandos de Linux. Necesita un teclado y una interfaz de salida de texto asociada. Las razones típicas para querer esto son la compatibilidad con la salida de texto en color, el manejo de varias combinaciones de teclas (como las teclas de flecha) y la capacidad de mover el cursor por la pantalla.

Cuando canalizas un comando a la ventana acoplable como echomuestra tu ejemplo, esa canalización es la entrada y esa canalización no tiene una interfaz tty, es solo un flujo de texto. Intentar crear un tty con eso fallará como lo indica el mensaje de error.

información relacionada