docker executa o ubuntu / bin / bash vs docker executa o ubuntu

15

Docker versão 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 a imagem ubuntu. E o que me incomoda é /bin/bash\. man docker runmostra que /bin/bashé um comando. Essa é 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á. E o palestrante não concentra a atenção no comando. Ele disse que estamos apenas rodando 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 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.

De qualquer maneira, decidi perguntar: talvez haja alguma diferença entre as duas maneiras de executar o Docker? Se houver, como é?

Michael
fonte

Respostas:

11

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

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

Por acaso, o comando padrão especificado para o Ubuntu Dockerfile é, de fato, bash:

CMD ["/bin/bash"]

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

Claro, isso nem sempre é verdade. Um Dockerfile para um mecanismo de banco de dados pode executar o comando de banco de dados por padrão. Nesse caso, se você precisar de um shell interativo, precisará fazê-lo docker run ... /bin/bash.

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

muru
fonte
2

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

Por exemplo, se uma imagem executar um servidor da Web em primeiro plano, o que você verá após o uso runsem /bin/bashos logs desse servidor da Web (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 esse "comando".

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

Ravexina
fonte