
Versión de Docker 17.06.0-ce
Estoy estudiando Docker viendo un curso en video.
El conferenciante muestra:
sudo docker run -ti ubuntu /bin/bash
Ejecute la ventana acoplable con la imagen de ubuntu. Y lo que me preocupa es /bin/bash\
.
man docker run
muestra que /bin/bash
es un comando. Eso es docker run IMAGE [COMMAND]
. Bueno, está bien. Pero ¿cuál es la diferencia entre
sudo docker run -ti ubuntu
y
sudo docker run -ti ubuntu /bin/bash
Para mí no hay ninguno. Y el profesor no centra la atención en la orden. Dijo que simplemente ejecutamos Docker. Fue su primer comando en el curso. Y luego muestra que hemos sido aislados de la máquina host, podemos arruinar libremente lo que queremos sin ningún daño (como rm -rf /bin).
Lo comprobé:
$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash
$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash
Bueno, por mi parte decidí tirar esta /bin/bash
parte a la basura.
Pero de todos modos decidí preguntarte: ¿tal vez haya alguna diferencia entre las dos formas de ejecutar Docker? Si lo hay, ¿cómo es?
Respuesta1
Las imágenes de Docker pueden especificar que un determinado comando se ejecute de forma predeterminada, utilizandola CMD
directiva en el Dockerfile. Y:
Si el usuario especifica argumentos,
docker run
anulará el valor predeterminado especificado enCMD
.
Da la casualidad de que el comando predeterminado especificado parael archivo Docker de Ubuntues, de hecho, bash:
CMD ["/bin/bash"]
Entonces, para el caso específico de la imagen de Ubuntu, docker run ... ubuntu /bin/bash
no es diferente de docker run ... ubuntu
.
Por supuesto, esto no tiene por qué ser así siempre. Un Dockerfile para un motor de base de datos puede ejecutar el comando de base de datos de forma predeterminada. En ese caso, si necesita un shell interactivo, deberá hacerlo docker run ... /bin/bash
.
En general, no puedes asumir que eso docker run
te dará un shell interactivo. Es más seguro especificar /bin/bash
si necesita un shell.
Respuesta2
Cuando no proporciona el comando, que en su caso es /bin/bash
, mientras usa -ti
( terminal i
interactivo t
), se le adjuntará al programa predeterminado que se ha definido para ejecutarse cuando use run
el comando en DockerFile
.
Por ejemplo, si una imagen ejecuta un servidor web en primer plano, lo que verá después de usarla run
sin ella /bin/bash
son los registros de ese servidor web (programa predeterminado que se ha ejecutado).
Al especificar el comando, me estás diciendo que no me importa lo que esté sucediendo o lo que se esté ejecutando en la imagen, dame una terminal interactiva ejecutando este "comando".
En Ubuntu, el comando predeterminado es bash
y, si no lo proporciona, -ti
el contenedor se detendrá inmediatamente después de ejecutarlo. porque ejecutó bash en modo no interactivo y, una vez finalizado, el contenedor ya no tiene nada que hacer.
Respuesta3
Intente ejecutar el siguiente comando y podrá comprender la diferencia.
sudo docker run -ti python
sudo docker run -ti python /bin/bash