docker execute o ubuntu / bin / bash vs o docker execute o ubuntu

3

Versão do Docker 17.06.0-ce

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

O palestrante mostra:

sudo docker run -ti ubuntu /bin/bash

Execute a janela de encaixe com imagem do Ubuntu. E o que me incomoda é /bin/bash\ . man docker run mostra que /bin/bash é um comando. Isso é docker run IMAGE [COMMAND] . Bem, 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 a executar o docker. Foi seu primeiro comando no curso. E então ele mostra que fomos isolados da máquina host, podemos arruinar livremente o que queremos sem nenhum dano (como rm -rf / bin).

Eu verifiquei:

$ 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, eu decidi jogar essa parte /bin/bash como lixo.

Mas de qualquer maneira eu decidi perguntar a você: talvez haja alguma diferença entre as duas maneiras de rodar o Docker? Se existe, como é?

    
por Michael 23.07.2017 / 09:48

2 respostas

3

As imagens do Docker podem especificar que um determinado comando deve ser executado por padrão, usando a diretiva CMD no Dockerfile . E:

  

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

Como acontece, o comando padrão especificado para o Dockerfile do Ubuntu é, de fato, bash:

CMD ["/bin/bash"]

Assim, para o caso específico da imagem do Ubuntu, docker run ... ubuntu /bin/bash nã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 assumir que docker run lhe dará um shell interativo. É mais seguro especificar /bin/bash se você precisar de um shell.

    
por muru 23.07.2017 / 10:01
1

Quando você não fornecer o comando, que no seu caso é /bin/bash , enquanto estiver usando -ti ( i interactive, t terminal), você será anexado ao programa padrão que foi definido para ser executado ao usar o comando run em DockerFile .

Por exemplo, se uma imagem executar um servidor da Web em primeiro plano, o que você verá depois de usar run sem o /bin/bash serão os registros desse servidor da Web (o programa padrão que foi executado).

Ao especificar o comando, você está dizendo que eu não me importo com o que está acontecendo ou está sendo executado na imagem, me dê um terminal interativo executando este "comando".

No Ubuntu, o comando padrão é bash e, se você não fornecer -ti , o contêiner será parado logo após a execução. porque ele executou o bash no modo não interativo e, depois de terminar, o contêiner não tem mais nada a fazer.

    
por Ravexina 23.07.2017 / 09:54