docker run ubuntu / bin / bash vs docker run ubuntu


15

Docker versione 17.06.0-ce

Sto studiando Docker guardando un video corso.

Il docente mostra:

sudo docker run -ti ubuntu /bin/bash

Esegui la finestra mobile con l'immagine Ubuntu. E ciò che mi preoccupa è /bin/bash\. man docker runmostra che /bin/bashè un comando. Questo è docker run IMAGE [COMMAND]. Bene, va bene. Ma qual è la differenza tra

sudo docker run -ti ubuntu 

e

sudo docker run -ti ubuntu /bin/bash

Per me non ce n'è. E il docente non focalizza l'attenzione sul comando. Ha detto che siamo semplicemente portatori di docker. Fu il suo primo comando nel corso. E poi mostra che siamo stati isolati dalla macchina host, possiamo rovinare liberamente ciò che vogliamo senza alcun danno (come rm -rf / bin).

Ho controllato:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash

Bene, per me stesso ho deciso di gettare questa /bin/bashparte come spazzatura.

Ma comunque ho deciso di chiederti: forse c'è qualche differenza tra i due modi di far funzionare Docker? Se c'è, com'è?

Risposte:


11

Le immagini Docker possono specificare che un determinato comando deve essere eseguito di default, usando la CMDdirettiva nel Dockerfile . E:

Se l'utente specifica argomenti a docker runcui sovrascriverà il valore predefinito specificato in CMD.

In effetti, il comando predefinito specificato per Ubuntu Dockerfile è, infatti, bash:

CMD ["/bin/bash"]

Quindi, per il caso specifico dell'immagine di Ubuntu, docker run ... ubuntu /bin/bashnon è diverso da docker run ... ubuntu.

Naturalmente, questo non deve essere sempre vero. Un file Docker per un motore di database può eseguire il comando database per impostazione predefinita. In tal caso, se ti serviva una shell interattiva, dovrai farlo docker run ... /bin/bash.

In generale, non puoi presumere che docker runti darà una shell interattiva. È più sicuro specificare /bin/bashse è necessaria una shell.


2

Quando non fornisci il comando, nel tuo caso /bin/bash, mentre usi -ti( iinterattivo, tterminale) verrai collegato al programma predefinito che è stato definito per essere eseguito quando usi il runcomando in DockerFile.

Ad esempio, se un'immagine esegue un server Web in primo piano, ciò che vedrai dopo l'utilizzo runsenza /bin/bashi registri di quel server Web (programma predefinito che è stato eseguito).

Mentre specifichi il comando, stai dicendo che non mi interessa cosa sta succedendo o è in esecuzione sull'immagine, dammi un terminale interattivo eseguendo questo "comando".

In Ubuntu il comando predefinito è bashe se non si fornisce -tiil contenitore verrà arrestato subito dopo l'esecuzione. perché ha eseguito la bash in modalità non interattiva e dopo aver terminato il contenitore non ha più nulla a che fare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.