Risposta in ritardo, ma potrebbe aiutare qualcuno
docker run/exec -i
collegherà lo STDIN del comando all'interno del contenitore allo STDIN dello docker run/exec
stesso.
Così
docker run -i alpine cat
ti dà una riga vuota in attesa di input. Digita "ciao" ottieni l'eco "ciao". Il contenitore non verrà chiuso fino a quando non si invia CTRL + D perché il processo principale cat
è in attesa di input dal flusso infinito che è l'input del terminale di docker run
.
- D'altra parte
echo "hello" | docker -i run alpine cat
stamperà "ciao" e uscirà immediatamente perché cat
nota che il flusso di input è terminato e termina da solo.
Se si tenta docker ps
di uscire da uno dei precedenti, non si troveranno contenitori in esecuzione. In entrambi i casi, cat
è terminato, quindi la finestra mobile ha terminato il contenitore.
Ora per "-t", questo dice al processo principale all'interno della finestra mobile che il suo input è un dispositivo terminale.
Così
docker run -t alpine cat
ti darà una riga vuota, ma se provi a digitare "ciao", non otterrai alcun eco. Questo perché mentre cat
è collegato a un ingresso terminale, questo ingresso non è collegato al tuo ingresso. Il "ciao" che hai digitato non ha raggiunto l'input di cat
. cat
è in attesa di input che non arrivano mai.
echo "hello" | docker run -t alpine cat
ti darà anche una riga vuota e non uscirà dal contenitore su CTRL-D ma non otterrai un eco "ciao" perché non hai superato -i
Se si invia CTRL + C, si ottiene indietro la shell, ma se si tenta docker ps
ora, si vede il cat
contenitore ancora in esecuzione. Questo perché cat
è ancora in attesa su un flusso di input che non è mai stato chiuso. Non ho trovato alcun uso utile per il -t
solo senza essere combinato con -i
.
Ora, per -it
insieme. Questo dice a cat che il suo input è un terminale e allo stesso tempo collega questo terminale al cui input docker run
è un terminale. docker run/exec
farà in modo che il proprio input sia in realtà un tty prima di passarlo a cat
. Questo è il motivo per cui otterrai un input device is not a TTY
se provi echo "hello" | docker run -it alpine cat
perché in questo caso, l'input di docker run
se stesso è il pipe dell'eco precedente e non il terminale in cui docker run
viene eseguito
Infine, perché dovresti passare -t
se -i
farà il trucco di collegare l'input cat
all'input? Questo perché i comandi trattano l'input in modo diverso se si tratta di un terminale. Anche questo è meglio illustrato dall'esempio
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p
ti darà una richiesta di password. Se si digita la password, i caratteri vengono stampati visibilmente.
docker run -i alpine sh
ti darà una riga vuota. Se si digita un comando come se ls
si ottenga un output, ma non si riceverà un prompt o un output colorato.
Negli ultimi due casi, si ottiene questo comportamento perché mysql
oltre a shell
non trattare l'input come tty e quindi non ha utilizzato un comportamento specifico di tty come mascherare l'input o colorare l'output.