No Docker, tanto o CMD
quanto o ENTRYPOINT
são usados para definir o processo principal que será executado dentro de um container. Ambos têm funções semelhantes, mas são utilizados de maneira diferente dependendo do comportamento que você deseja que o container tenha.
O que é CMD?
O CMD
no Dockerfile é utilizado para especificar o comando padrão a ser executado quando um container é iniciado. No entanto, ele pode ser substituído por argumentos passados na linha de comando ao executar o container. O Docker permite definir o CMD
de duas formas:
Forma shell:
CMD comando param1 param2
Forma exec:
CMD ["executable", "param1", "param2"]
Exemplo de CMD:
FROM ubuntu:latest
CMD ["echo", "Hello, World!"]
Neste exemplo, o comando echo
é o comando padrão executado quando o container é iniciado. Se quisermos substituir esse comando durante a execução do container, podemos fazer isso assim:
docker run <container_id> echo "Outro comando"
O CMD
será sobrescrito pelo novo comando passado na linha de comando.
O que é ENTRYPOINT?
Já o ENTRYPOINT
define um comando que será sempre executado e não pode ser sobrescrito facilmente. Ele é útil quando você deseja garantir que um determinado comando será sempre executado, independentemente de argumentos adicionais fornecidos ao container. O ENTRYPOINT
também pode ser definido de duas formas:
Forma shell:
ENTRYPOINT comando param1 param2
Forma exec:
ENTRYPOINT ["executable", "param1", "param2"]
Exemplo de ENTRYPOINT:
FROM ubuntu:latest
ENTRYPOINT ["echo", "Mensagem fixa:"]
Se você executar o container com:
docker run <container_id> "Este é o argumento"
O resultado será:
Mensagem fixa: Este é o argumento
Aqui, o ENTRYPOINT
é sempre executado, mas você pode adicionar argumentos na execução do container.
CMD vs ENTRYPOINT
Embora os dois sejam usados para definir o comando que será executado, eles diferem em como interagem com os argumentos fornecidos durante a execução do container. Algumas diferenças importantes:
Substituição:
O CMD
pode ser facilmente sobrescrito ao passar um comando na execução do container.
O ENTRYPOINT
, por outro lado, não é sobrescrito. Ele sempre será executado, e qualquer argumento adicional será passado como argumento do ENTRYPOINT
.
Combinando os dois: Você pode usar o CMD
e o ENTRYPOINT
juntos. Neste caso, o ENTRYPOINT
define o executável que será sempre rodado, enquanto o CMD
define os parâmetros padrão que podem ser sobrescritos.
Exemplo combinando ENTRYPOINT e CMD:
FROM ubuntu:latest
ENTRYPOINT ["echo"]
CMD ["Argumento padrão"]
Ao executar o container sem passar argumentos:
docker run <container_id>
O resultado será:
Argumento padrão
Mas, se você passar um argumento durante a execução:
docker run <container_id> "Outro argumento"
O resultado será:
Outro argumento
Considerações adicionais
Script como ENTRYPOINT: Uma prática comum é usar um script como ENTRYPOINT
para garantir que o container sempre execute o script desejado, mas ainda permita passar argumentos adicionais.
Execução de serviços: O ENTRYPOINT
é mais adequado para containers que são configurados para rodar como serviços, enquanto o CMD
é útil para containers que podem ter comandos mais dinâmicos dependendo da situação.
Em Resumo:
Use
CMD
quando quiser fornecer um comando padrão que pode ser sobrescrito.Use
ENTRYPOINT
quando quiser garantir que um comando específico sempre será executado.Combine
CMD
eENTRYPOINT
para fornecer flexibilidade ao seu container.