CMD e ENTRYPOINT no Docker

CMD e ENTRYPOINT no Docker

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 e ENTRYPOINT para fornecer flexibilidade ao seu container.

Did you find this article valuable?

Support Nilson Vieira by becoming a sponsor. Any amount is appreciated!