Docker ejecutar ubuntu / bin / bash vs Docker ejecutar ubuntu

15

Docker versión 17.06.0-ce

Estoy estudiando Docker viendo un video curso.

El profesor muestra:

sudo docker run -ti ubuntu /bin/bash

Ejecute docker con la imagen ubuntu. Y lo que me preocupa es /bin/bash\. man docker runmuestra que /bin/bashes un comando. Es decir docker run IMAGE [COMMAND]. Bueno, esta bien. ¿Pero cuál es la diferencia entre

sudo docker run -ti ubuntu 

y

sudo docker run -ti ubuntu /bin/bash

Para mi no hay ninguno. Y el profesor no centra la atención en el comando. Dijo que solo estamos ejecutando docker. Fue su primer comando en el curso. Y luego muestra que hemos estado 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, para mí decidí tirar esta /bin/bashparte como basura.

Pero de todos modos, decidí preguntarte: ¿tal vez hay alguna diferencia entre las dos formas de ejecutar Docker? Si hay, ¿cómo es?

Miguel
fuente

Respuestas:

11

Las imágenes de Docker pueden especificar que un determinado comando se ejecute de forma predeterminada, utilizando la CMDdirectiva en el Dockerfile . Y:

Si el usuario especifica argumentos para docker run, anulará el valor predeterminado especificado en CMD.

De hecho, el comando predeterminado especificado para Ubuntu Dockerfile es, de hecho, bash:

CMD ["/bin/bash"]

Entonces, para el caso específico de la imagen de Ubuntu, docker run ... ubuntu /bin/bashno es diferente de docker run ... ubuntu.

Por supuesto, esto no tiene por qué ser cierto 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 puede asumir que eso docker runle dará un shell interactivo. Es más seguro especificar /bin/bashsi necesita un shell.

muru
fuente
2

Cuando no proporcione el comando, que en su caso es /bin/bash, mientras usa -ti( iinteractivo, tterminal), se conectará al programa predeterminado que se ha definido para ejecutarse al usar el runcomando in DockerFile.

Por ejemplo, si una imagen ejecuta un servidor web en primer plano, lo que verá después de usar runsin el /bin/bashes los registros de ese servidor web (programa predeterminado que se ha ejecutado).

Al especificar el comando, usted dice que no me importa lo que está sucediendo o se está ejecutando en la imagen, deme un terminal interactivo ejecutando este "comando".

En Ubuntu, el comando predeterminado es bashy si no proporciona -tiel contenedor se detendrá justo después de ejecutarse. porque ejecutó el bash en modo no interactivo, y después de terminar, el contenedor ya no tiene nada que hacer.

Ravexina
fuente