Olá, Rodrigo!
A dúvida que você levantou é bastante comum quando estamos começando a trabalhar com Docker. Vamos lá!
O CMD e o ENTRYPOINT são ambos usados para definir o comando que será executado quando um contêiner é iniciado a partir de uma imagem Docker. No entanto, eles têm algumas diferenças sutis que podem influenciar na forma como você decide usá-los.
CMD: O CMD é usado para fornecer argumentos padrão para o ENTRYPOINT ou para especificar o comando a ser executado se não for fornecido nenhum comando na linha de comando do docker run. Se você usar CMD ["yarn", "start"], isso significa que, por padrão, o contêiner irá executar yarn start quando iniciado. No entanto, se você fornecer um comando diferente ao executar o contêiner, esse comando substituirá o CMD.
Exemplo prático:
CMD ["yarn", "start"]
Se você executar:
docker run minha-imagem
Ele executará yarn start. Mas se você executar:
docker run minha-imagem ls
Ele executará ls em vez de yarn start.
ENTRYPOINT: O ENTRYPOINT define um comando fixo que sempre será executado quando o contêiner iniciar. Quando você usa ENTRYPOINT ["yarn", "start"], você está dizendo que yarn start é o comando que sempre será executado, e qualquer argumento passado na linha de comando será adicionado a esse comando.
Exemplo prático:
ENTRYPOINT ["yarn", "start"]
Se você executar:
docker run minha-imagem
Ele executará yarn start. E se você executar:
docker run minha-imagem --verbose
Ele executará yarn start --verbose.
Em resumo, use CMD quando você quiser permitir que o comando padrão seja facilmente substituído, e use ENTRYPOINT quando você quiser garantir que um comando específico sempre seja executado.
Bons estudos!