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
mismo.
Entonces
docker run -i alpine cat
le 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 principal cat
está esperando la entrada del flujo infinito que es la entrada terminal del docker run
.
- Por otro lado
echo "hello" | docker -i run alpine cat
, imprimirá "hola" y saldrá inmediatamente porque se cat
da cuenta de que la secuencia de entrada ha finalizado y termina por sí misma.
Si intenta docker ps
después de salir de cualquiera de los anteriores, no encontrará ningún contenedor en ejecución. En ambos casos, el cat
mismo 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 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 escribió no alcanzó 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ía CTRL + C, recupera su shell, pero si lo intenta docker ps
ahora, verá que el cat
contenedor sigue ejecutándose. Esto se debe a cat
que todavía está esperando una secuencia de entrada que nunca se cerró. No he encontrado ningún uso útil para el -t
solo sin ser combinado con -i
.
Ahora, para -it
juntos. Esto le dice a cat que su entrada es una terminal y al mismo tiempo conecte esta terminal a la entrada de la docker run
cual es una terminal. docker run/exec
se asegurará de que su propia entrada sea de hecho un tty antes de pasarla cat
. Es por eso que obtendrá un input device is not a TTY
si lo intenta echo "hello" | docker run -it alpine cat
porque en este caso, la entrada de docker run
sí mismo es la tubería del eco anterior y no el terminal donde docker run
se ejecuta
Finalmente, ¿por qué necesitaría pasar -t
si -i
hará el truco de conectar su entrada a cat
la 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 -p
le dará un mensaje de contraseña. Si escribe la contraseña, los caracteres se imprimen visiblemente.
docker run -i alpine sh
te dará una línea vacía. Si escribe un comando como ls
se 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 de shell
no tratar la entrada como un tty, no utilizó el comportamiento específico de tty como enmascarar la entrada o colorear la salida.