Risposta in ritardo, ma potrebbe aiutare qualcuno
docker run/exec -icollegherà lo STDIN del comando all'interno del contenitore allo STDIN dello docker run/execstesso.
Così
docker run -i alpine catti 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 catstamperà "ciao" e uscirà immediatamente perché catnota che il flusso di input è terminato e termina da solo.
Se si tenta docker psdi 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 catti 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 psora, si vede il catcontenitore 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 -tsolo senza essere combinato con -i.
Ora, per -itinsieme. 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/execfarà 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 TTYse provi echo "hello" | docker run -it alpine catperché in questo caso, l'input di docker runse stesso è il pipe dell'eco precedente e non il terminale in cui docker runviene eseguito
Infine, perché dovresti passare -tse -ifarà il trucco di collegare l'input catall'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 -pti darà una richiesta di password. Se si digita la password, i caratteri vengono stampati visibilmente.
docker run -i alpine shti darà una riga vuota. Se si digita un comando come se lssi ottenga un output, ma non si riceverà un prompt o un output colorato.
Negli ultimi due casi, si ottiene questo comportamento perché mysqloltre a shellnon trattare l'input come tty e quindi non ha utilizzato un comportamento specifico di tty come mascherare l'input o colorare l'output.