docker run ubuntu / bin / bash vs docker run ubuntu

15

Docker version 17.06.0-ce

J'étudie Docker en regardant un cours vidéo.

Le conférencier montre:

sudo docker run -ti ubuntu /bin/bash

Exécutez docker avec l'image ubuntu. Et ce qui me dérange, c'est /bin/bash\. man docker runmontre que /bin/bashc'est une commande. C'est ça docker run IMAGE [COMMAND]. Eh bien, ça va. Mais quelle est la différence entre

sudo docker run -ti ubuntu 

et

sudo docker run -ti ubuntu /bin/bash

Pour moi, il n'y en a pas. Et le conférencier ne concentre pas son attention sur la commande. Il a dit que nous venons de courir docker. C'était son premier commandement du cours. Et puis il montre que nous avons été isolés de la machine hôte, nous pouvons librement ruiner ce que nous voulons sans aucun dommage (comme rm -rf / bin).

J'ai vérifié:

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


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

Eh bien, pour moi, j'ai décidé de jeter cette /bin/bashpartie comme une poubelle.

Mais de toute façon, j'ai décidé de vous demander: peut-être qu'il y a une différence entre les deux façons de faire fonctionner Docker? S'il y en a, à quoi ressemble-t-il?

Michael
la source

Réponses:

11

Les images Docker peuvent spécifier qu'une certaine commande doit être exécutée par défaut, en utilisant la CMDdirective dans le Dockerfile . Et:

Si l'utilisateur spécifie des arguments, docker runils remplaceront la valeur par défaut spécifiée dans CMD.

En l'occurrence , la commande par défaut spécifiée pour le Dockerfile Ubuntu est, en fait, bash:

CMD ["/bin/bash"]

Donc, pour le cas spécifique de l'image Ubuntu, docker run ... ubuntu /bin/bashn'est pas différent de docker run ... ubuntu.

Bien sûr, cela ne doit pas toujours être vrai. Un Dockerfile pour un moteur de base de données peut exécuter la commande de base de données par défaut. Dans ce cas, si vous aviez besoin d'un shell interactif, vous devrez le faire docker run ... /bin/bash.

En général, vous ne pouvez pas supposer que docker runcela vous donnera un shell interactif. Il est plus sûr de spécifier /bin/bashsi vous avez besoin d'un shell.

muru
la source
2

Lorsque vous ne fournissez pas la commande, ce qui est dans votre cas /bin/bash, lors de l'utilisation -ti( iinteractive, tterminal), vous serez attaché au programme par défaut qui a été défini pour être exécuté lors de l'utilisation de la runcommande dans DockerFile.

Par exemple, si une image exécute un serveur Web au premier plan, ce que vous verrez après utilisation runsans le, ce /bin/bashsont les journaux de ce serveur Web (programme par défaut qui a été exécuté).

En spécifiant la commande, vous dites que peu m'importe ce qui se passe ou s'exécute sur l'image, donnez-moi un terminal interactif en exécutant cette "commande".

Dans Ubuntu, la commande par défaut est bashet si vous ne fournissez pas -tile conteneur sera arrêté juste après avoir été exécuté. car il a exécuté le bash en mode non interactif, et une fois terminé, le conteneur n'a plus rien à faire.

Ravexina
la source