Salve, Deus, beleza? Continuamos a saga aqui no nosso módulo de Docker. Para poder terminar esse capítulo, nós vamos falar agora de duas instruções de Dockerfile que são muito importantes, que é o CMD que a gente já viu versus o Entry Point, que é muito semelhante, que acaba gerando confusão. Quanto eu uso um, quanto eu uso o outro? Na verdade, dá para usar os dois ao mesmo tempo, eu vou mostrar isso aqui na aula. Então, vamos para o VFCode. As instruções da aula estão aqui. Então, nós já delimitamos aqui no curso o significado do command, que é quando o container iniciar, o Docker vai executar. iniciar, o docker vai executar nosso container, na verdade, é ruim falar o docker, né? Porque não é exatamente o docker, mas esse comando vai ser executado ali, e esse comando ele pode tanto ficar executando eternamente rodando aqui um servidor, que na verdade é um while true no final das contas, ou um comando normal, e vai fazer alguma coisa, e o container vai morrer depois disso. Então o command a gente já viu como funciona. Ah, mas e o tal do entryPoint? Olha só, vamos fazer aqui entryPoint. Eu vou copiar a mesmíssima coisa daqui pra cá. e vamos rodar isso aqui então estou no capítulo 4 peraí, o capítulo cap 4 aqui, então vamos fazer aqui um build menos t bem rápido, a gente já viu aqui se não teve modificação nenhuma, os layers são reaproveitados. Agora vamos fazer um run. Eu nem preciso testar aqui que já funcionou, não vou nem fazer com curse. As características que apareceram é porque eu apertei um atalho aqui no meu teclado. Então, poxa, qual é a diferença? Vamos voltar para o command. Aí a gente vai fazer o stop. Tem que fazer o build para poder gerar a nova imagem. E agora vamos fazer o run. A gente já viu que depois aqui do nome da imagem, nós podemos passar um comando que vai ser executado lá. Então, se eu passar aqui bash, se eu passar bin barra bash, ah, não vai, bash vai porque eu tenho que colocar "-it". Esse init a gente não está nem utilizando, então vamos tirar. Então, olha só. A gente tem aqui o acesso ao bash desse container. Se eu fizer um psaux, mas eu não tenho aqui, né? Vou fazer a instalação dele com apt-update, porque senão ele não vai encontrar, e aí faz um install Pronto. Então, a gente vê aqui que só tem duas coisas que estão sendo executadas. A gente lembra no APS, a gente está vendo ali o barra PROC aqui do nosso namespace apenas. Eu só tenho o BASH que está executando e o PROC PS que foi executado. O meu comando do SH que executa tudo isso foi sobrescrito. Então, quando eu estou com o command definido, no momento de eu executar o container, se eu passar alguma coisa no final do meu docker run, se eu passar no final do meu docker run como foi passado aqui, então ele sobrescreve o command. Ao contrário do entry point, olha só, se eu colocar aqui entry point, vamos fazer o teste. Então eu vou executar novamente E eu não consigo entrar no bash aqui Ele forçou a execução Do meu Comando Mas eu não posso passar algo aqui Depois? Sim Mas aí qual é a diferença? A diferença é que aquele bash Ele foi agregado Nesse comando, que não fez sentido Acabou sendo descartado Às vezes eu poderia passar alguma coisa ali Que quebrasse esse comando como um todo Então quando eu tenho o entry point Ele fixa O comando que vai ser executado Inclusive eu posso fazer aqui o seguinte Se eu colocar um echo No entry point Um echo Hello world Vamos fazer aqui um build Se eu fizer o run Diretamente vai mostrar o hello world. Agora se eu acrescentar teste, ele foi agregado. Eu não consigo substituir. Então nesse caso, voltando aqui para o comando convencional aqui com endpoint, vou fazer o build, aí eu rodo aqui, né? Estou passando alguma coisa que não está tendo incidência, acho que dificilmente a gente teria algum erro aqui por conta de estar executando diretamente o shell script. Aí eu só conseguiria entrar nesse container depois de estar rodando ele e num outro terminal fazer o exec. Que agora sim eu consigo entrar ali e fazer os meus comandos. Então, a diferença é exatamente essa. Mas não significa que a gente tenha que usar um ou outro. Mas já vamos definir aqui, já vamos definir quando usar um ou quando usar outro. Quando você tem uma situação em que você quer que as pessoas ou quem for executar o container baseado na sua imagem consiga facilmente, ela tem necessidades diversas, então você pode deixar com o command, porque ele é flexível, ele permite que a pessoa define o que vai ser executado. Agora, vamos supor que você tenha uma... A sua imagem é basicamente uma ferramenta que você está disponibilizando para as pessoas poderem utilizar. Vamos supor que você está criando uma imagem que vai ter lá o Jest do Node, aquela ferramenta para poder executar testes automatizados. A sua imagem vai dispor isso. Então você pode deixar aqui já Jest no entry point Jest no entry point que aí na hora que todo mundo for executar a linha, eu passo aqui, eu quero executar lá os testes na minha pasta source e o meu index.test.ts. Enfim, eu não preciso passar aqui o Jest. Então, todo mundo que vai usar essa ferramenta não vai querer ficar entrando no terminal ou algo do tipo. Se quiser entrar no terminal, a gente acaba conseguindo fazer. Mas sempre vai ser rodar alguma coisa no final das contas. Se eu tiver algo desse tipo aqui, como eu faria para poder entrar na imagem? Como eu faria para poder entrar na imagem. Como que eu faria para poder entrar na imagem. Eu definiria um entry point para poder substituir da imagem que eu estou herdando, que eu quero utilizar. Quando você herda de uma imagem, se ela tiver lá o command ou entry point, se você colocar, ele substitui o da imagem que você está utilizando. Então, vamos voltar ao que estava aqui antes. Mas tem situações que são mais avançadas, a gente pode usar os dois ao mesmo tempo, e eu vou pegar como exemplo o próprio Nginx. Vamos pegar aqui. A gente usou bastante o Nginx aqui já nas aulas. Qualquer imagem do Nginx aqui serve para a gente poder ver. Olha que interessante. Temos um entry point e um command na mesma imagem. Por quê? Lembra que o entry point fixa ali que todo mundo tem que passar por ele? Então, colocando os dois ao mesmo tempo, colocando os dois ao mesmo tempo, o entry point fixa que quando o container iniciar vai ser um barra container entry point sh que vai ser executado. Mas o cmd vai acabar, quando eu tenho os dois, ele acaba sendo juntado com o entry point sh. Vamos dar uma olhadinha no NGINX. Vou pegar o VS Code aqui. A gente vai rodar um... Vamos fazer um "-it", direto. Com um sh, não tem um bash lá. Aí se eu fizer ali, tem o arquivinho. O que tem dentro desse arquivo? Ele é um shell script que ele aceita parâmetros então se eu fizer algo assim .docker entry point sh echo hello world então ele acaba mostrando o hello world isso aqui é uma situação que acaba sendo necessária, o caso de uso real para utilizar os dois, que é que tudo passa por algum script SH para você poder fazer alguma verificação, alguma configuração. Então aqui ele está fazendo algumas verificações. Ah, eu tenho ali alguma coisa em relativo a Nginx? alguma configuração, então aqui ele está fazendo algumas verificações. Ah, eu tenho ali alguma coisa em relativo ao Nginx? Não, é algo convencional, então eu vou rodar o Nginx. Melhor, se eu tenho algo que é específico, então eu não vou rodar o Nginx. Se é algo aqui que tem a Nginx, eu vou fazer tal coisa para poder consolidar e organizar a execução da ferramenta ali para poder ajudar as pessoas que estão utilizando, para poder ajudar todo mundo que está utilizando aquela imagem ali. Então, você pode criar um script SH, pegar os parâmetros, fazer validações e coisas do tipo. Inclusive, até a própria imagem do Node não parece, mas a própria imagem do Node tem. Vamos dar uma olhadinha aqui Tags Tem aí uma 29 slim A gente vai olhar que tem um command Node Com um entry point, né? Então Se eu não fizer nada, olha só que legal Vamos matar aqui o Nginx. Se eu fizer um run Node 20 Slim menos menos version, ele está mostrando a versão do Node. Porque eu tenho o command node como padrão. Como eu estou passando, ele vai substituir aqui esse comando, mas o menos menos version é agregado. Ele vê, opa, não é um comando específico, né? É uma opção que aí ele pega ali e agrega o "-version", e força o Node por debaixo desse script. Então, é um if que a gente acaba tendo para poder organizar. Normalmente essas imagens mais oficiais acabam fazendo isso. O padrão, se eu não fizer nada, ele acaba executando um Node. Então, de forma geral, a gente pode colocar essa regra assim. Vai sempre de command que já está excelente. Se tiver alguma situação especificante, isso aqui vai vir com o tempo. Aí você vai sentir a necessidade de melhorar isso. Com essa dica aqui da aula também já abriu a sua cabeça, mas o command já vai atender a maioria dos casos, porque fica ali um comando padrão, mas se a gente quiser rodar um outro comando aí substitui totalmente. Então, pessoal, vamos seguir na nossa saga. É isso aí. E até a próxima