docker executa o Ubuntu /bin/bash vs docker executa o Ubuntu

docker executa o Ubuntu /bin/bash vs docker executa o Ubuntu

Docker versão 17.06.0-ce

Estou estudando Docker assistindo a um curso em vídeo.

O palestrante mostra:

sudo docker run -ti ubuntu /bin/bash

Execute o docker com imagem do Ubuntu. E o que me incomoda é /bin/bash\. man docker runmostra que isso /bin/bashé um comando. Aquilo é docker run IMAGE [COMMAND]. Bem, está tudo bem. Mas qual é a diferença entre

sudo docker run -ti ubuntu 

e

sudo docker run -ti ubuntu /bin/bash

Para mim não há nenhum. E o palestrante não foca a atenção no comando. Ele disse que estamos apenas executando o docker. Foi seu primeiro comando no curso. E então ele mostra que estamos isolados da máquina host, podemos arruinar livremente o que quisermos sem nenhum dano (como rm -rf /bin).

Eu chequei:

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


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

Bem, por mim mesmo decidi jogar essa /bin/bashparte fora como lixo.

Mas de qualquer forma resolvi te perguntar: talvez haja alguma diferença entre as duas formas de rodar o Docker? Se houver, como é?

Responder1

As imagens Docker podem especificar que um determinado comando deve ser executado por padrão, usandoa CMDdiretiva no Dockerfile. E:

Se o usuário especificar argumentos para docker runentão eles substituirão o padrão especificado em CMD.

Acontece que o comando padrão especificado parao Dockerfile do Ubuntué, na verdade, bash:

CMD ["/bin/bash"]

Então, para o caso específico da imagem do Ubuntu, docker run ... ubuntu /bin/bashnão é diferente de docker run ... ubuntu.

Claro, isso não precisa ser verdade sempre. Um Dockerfile para um mecanismo de banco de dados pode executar o comando do banco de dados por padrão. Nesse caso, se você precisar de um shell interativo, precisará fazer docker run ... /bin/bash.

Em geral, você não pode presumir que isso docker runlhe dará um shell interativo. É mais seguro especificar /bin/bashse você precisa de um shell.

Responder2

Quando você não fornece o comando, que no seu caso é /bin/bash, ao usar -ti( iinterativo, tterminal) você será anexado ao programa padrão que foi definido para ser executado ao usar runo comando em DockerFile.

Por exemplo, se uma imagem executa um servidor web em primeiro plano, o que você verá após usar runsem o /bin/bashé os logs desse servidor web (programa padrão que foi executado).

Ao especificar o comando, você está dizendo que não me importo com o que está acontecendo ou em execução na imagem, forneça-me um terminal interativo executando este "comando".

No Ubuntu o comando padrão é bashe se você não fornecer -tio container será interrompido logo após ser executado. porque ele executou o bash em modo não interativo e depois de concluído o contêiner não tem mais nada para fazer.

Responder3

Tente executar o comando abaixo e você entenderá a diferença

sudo docker run -ti python
sudo docker run -ti python /bin/bash

informação relacionada