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 averiguar exactamente qué sucede aquí. No solo "eliminar -t y se solucionará".
Sé que docker run's -topción significa 'Asignar un pseudo-TTY', y he leído descripciones históricas de lo que significa TTY , pero no me ayude a entender qué tipo de contrato se viola aquí.

-t, pero no puedo modificar el comando de inicio de la ventana acoplable en producción. Así que necesito hacer que la aplicación piense que se inició-t.Respuestas:
Esta respuesta me ayudó a comprender:
-ini-topciones) un contenedor Docker solo envía su salida a STDOUT,-iopción viene la conexión a STDIN,-tla opción extrae un controlador de interfaz de terminal , que funciona sobre STDIN / STDOUT. Y cuando se conecta un controlador de terminal, la comunicación con un contenedor debe cumplir con el protocolo de interfaz de terminal . Tubería de una cadena no.fuente
Respuesta tardía, pero podría ayudar a alguien
docker run/exec -iconectará el STDIN del comando dentro del contenedor al STDIN deldocker run/execmismo.Entonces
docker run -i alpine catle da una línea vacía en espera de entrada. Escriba "hola" obtendrá un eco "hola". El contenedor no saldrá hasta que envíe CTRL + D porque el proceso principalcatestá esperando la entrada del flujo infinito que es la entrada terminal deldocker run.echo "hello" | docker -i run alpine cat, imprimirá "hola" y saldrá inmediatamente porque secatda cuenta de que la secuencia de entrada ha finalizado y termina por sí misma.Si intenta
docker psdespués de salir de cualquiera de los anteriores, no encontrará ningún contenedor en ejecución. En ambos casos, elcatmismo ha terminado, por lo tanto, la ventana acoplable ha terminado el contenedor.Ahora para "-t", esto le dice al proceso principal dentro de Docker 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 mientrascatestá conectado a una entrada de terminal, esta entrada no está conectada a su entrada. El "hola" que escribió no alcanzó la entrada decat.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 en CTRL-D pero no obtendrá un eco "hola" porque no pasó-iSi envía CTRL + C, recupera su shell, pero si lo intenta
docker psahora, verá que elcatcontenedor sigue ejecutándose. Esto se debe acatque todavía está esperando una secuencia de entrada que nunca se cerró. No he encontrado ningún uso útil para el-tsolo sin ser combinado con-i.Ahora, para
-itjuntos. Esto le dice a cat que su entrada es una terminal y al mismo tiempo conecte esta terminal a la entrada de ladocker runcual es una terminal.docker run/execse asegurará de que su propia entrada sea de hecho un tty antes de pasarlacat. Es por eso que obtendrá uninput device is not a TTYsi lo intentaecho "hello" | docker run -it alpine catporque en este caso, la entrada dedocker runsí mismo es la tubería del eco anterior y no el terminal dondedocker runse ejecutaFinalmente, ¿por qué necesitaría pasar
-tsi-ihará el truco de conectar su entrada acatla entrada de? Esto se debe a que los comandos tratan la entrada de manera diferente si es un terminal. Esto también se ilustra mejor con un ejemplo.docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -ple dará un mensaje de contraseña. Si escribe la contraseña, los caracteres se imprimen visiblemente.docker run -i alpine shte dará una línea vacía. Si escribe un comando comolsse obtiene una salida, pero no obtendrá un mensaje o una salida de color.En los últimos dos casos, obtiene este comportamiento porque
mysql, además deshellno tratar la entrada como un tty, no utilizó el comportamiento específico de tty como enmascarar la entrada o colorear la salida.fuente
Un tty indica que tiene un terminal, algo que proporcionaría 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 lo
echomuestra su ejemplo, esa canalización es la entrada y esa canalización no tiene una interfaz tty, es solo una secuencia de texto. Intentar crear un tty con eso fallará como indica el mensaje de error.fuente