GNU/Linux >> Tutoriales Linux >  >> Linux

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

Solución 1:

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

docker run/exec -i conectará el STDIN del comando dentro del contenedor al STDIN del docker run/exec sí mismo.

Entonces

  • docker run -i alpine cat le da una línea vacía esperando entrada. Escriba "hola" obtendrá un eco "hola". El contenedor no saldrá hasta que envíe CTRL+D porque el proceso principal cat está esperando la entrada del flujo infinito que es la entrada del terminal del docker run .
  • Por otro lado echo "hello" | docker -i run alpine cat imprimirá "hola" y saldrá inmediatamente porque cat se da cuenta de que el flujo de entrada ha terminado y termina solo.

Si intenta docker ps después de salir de cualquiera de los anteriores, no encontrará ningún contenedor en ejecución. En ambos casos, cat 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 cat le dará una línea vacía, pero si intenta escribir "hola", no obtendrá ningún eco. Esto se debe a que mientras cat está 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 . cat está esperando una entrada que nunca llega.
  • echo "hello" | docker run -t alpine cat también le dará una línea vacía y no saldrá del contenedor en CTRL-D pero no obtendrá un eco "hola" porque no pasó -i

Si envías CTRL+C, recuperas tu shell, pero si intentas docker ps ahora, ves el cat contenedor sigue funcionando. Esto se debe a que cat todavía está esperando un flujo de entrada que nunca se cerró. No he encontrado ningún uso útil para el -t solo sin combinarse con -i .

Ahora, para -it juntos. Esto le dice a cat que su entrada es una terminal y al mismo tiempo conecta esta terminal a la entrada de docker run que es una terminal. docker run/exec se asegurará de que su propia entrada sea de hecho un tty antes de pasarlo a cat . Es por eso que obtendrá un input device is not a TTY si intenta echo "hello" | docker run -it alpine cat porque en este caso, la entrada de docker run en sí es la canalización del eco anterior y no la terminal donde docker run se ejecuta

Finalmente, ¿por qué tendría que pasar -t si -i hará el truco de conectar su entrada a cat entrada de? Esto se debe a que los comandos tratan la entrada de manera diferente si se trata de una terminal. Esto también se ilustra mejor con un ejemplo

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p le dará una solicitud de contraseña. Si escribe la contraseña, los caracteres se imprimen visiblemente.
  • docker run -i alpine sh le dará una línea vacía. Si escribe un comando como ls obtiene un resultado, pero no obtendrá un aviso ni un resultado en color.

En los dos últimos casos, obtiene este comportamiento porque mysql así como shell no estaban tratando la entrada como un tty y, por lo tanto, no usaron un comportamiento específico de tty como enmascarar la entrada o colorear la salida.

Solución 2:

Esta respuesta me ayudó a comprender:

  • por defecto (sin -i ni -t options) un contenedor Docker solo envía su salida a STDOUT,
  • con -i opción viene conexión a STDIN,
  • -t la opción extrae un controlador de interfaz de terminal , que funciona sobre STDIN/STDOUT. Y cuando se atrae un controlador de terminal, la comunicación con un contenedor debe cumplir con el protocolo de interfaz de terminal. Canalizar una cadena no lo hace.

Solución 3:

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 canaliza un comando en la ventana acoplable como su echo El ejemplo muestra que esa tubería es la entrada y esa tubería no tiene una interfaz tty, es solo una secuencia de texto. Intentar crear un tty con eso fallará como indica el mensaje de error.


Linux
  1. ¿Qué significa el tamaño de un directorio en la salida del comando 'ls -l'?

  2. ¿Qué significa en la salida de Ps?

  3. ¿Qué significa esta salida de Xev?

  4. ¿Qué significa un punto antes del nombre de la variable en struct?

  5. ¿Qué significa &al final de un comando de Linux?

¿Qué significa el atributo 's' en los permisos de archivo?

¿Qué significa rc en archivos de puntos?

El indicador de bash de Docker no muestra la salida de color

¿Qué significa la sintaxis |&en lenguaje shell?

iptables:¿qué significa exactamente --src-type LOCAL?

¿Qué significa el sufijo .d en Linux?