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!