ventana acoplable ejecutar ubuntu /bin/bash frente a ventana acoplable ejecutar ubuntu

ventana acoplable ejecutar ubuntu /bin/bash frente a ventana acoplable ejecutar ubuntu

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 runmuestra que /bin/bashes 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/bashparte 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 CMDdirectiva en el Dockerfile. Y:

Si el usuario especifica argumentos, docker runanulará el valor predeterminado especificado en CMD.

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/bashno 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 runte dará un shell interactivo. Es más seguro especificar /bin/bashsi necesita un shell.

Respuesta2

Cuando no proporciona el comando, que en su caso es /bin/bash, mientras usa -ti( terminal iinteractivo t), se le adjuntará al programa predeterminado que se ha definido para ejecutarse cuando use runel comando en DockerFile.

Por ejemplo, si una imagen ejecuta un servidor web en primer plano, lo que verá después de usarla runsin ella /bin/bashson 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 bashy, si no lo proporciona, -tiel 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

información relacionada