
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 run
mostra 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/bash
parte 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 CMD
diretiva no Dockerfile. E:
Se o usuário especificar argumentos para
docker run
então eles substituirão o padrão especificado emCMD
.
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/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 presumir que isso docker run
lhe dará um shell interativo. É mais seguro especificar /bin/bash
se você precisa de um shell.
Responder2
Quando você não fornece o comando, que no seu caso é /bin/bash
, ao usar -ti
( i
interativo, t
terminal) você será anexado ao programa padrão que foi definido para ser executado ao usar run
o comando em DockerFile
.
Por exemplo, se uma imagem executa um servidor web em primeiro plano, o que você verá após usar run
sem 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 é bash
e se você não fornecer -ti
o 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