CMD
A instrução CMD
em um Dockerfile é usada para fornecer comandos ou argumentos padrão que devem ser executados quando um contêiner é iniciado. Diferente de ENTRYPOINT
, que define um comando fixo, CMD
pode ser substituído quando um comando é passado durante a execução do contêiner. Se CMD
for usado junto com ENTRYPOINT
, ele especifica os argumentos padrão para o comando definido pelo ENTRYPOINT
.
Sintaxe Básica
CMD
pode ser definido de três formas:
Exec Form (Forma Exec): Usando um array, executa o comando diretamente sem um shell, o que é preferido por ser mais eficiente e seguro.
Shell Form (Forma Shell): Usando uma string, executa o comando dentro de um shell.
Argumentos para
ENTRYPOINT
: Usado para fornecer argumentos padrão quando combinado comENTRYPOINT
.
Funcionalidade do CMD
CMD
Comando Padrão:
CMD
define um comando ou argumento padrão que será usado se nenhum outro comando for especificado ao executar o contêiner.Combinação com
ENTRYPOINT
: Quando combinado comENTRYPOINT
,CMD
fornece argumentos padrão para o comando especificado noENTRYPOINT
.
Exemplos de Uso
Definindo um Comando Padrão
Neste exemplo, ao iniciar o contêiner, ele executará echo Hello, World!
como comando padrão.
Substituindo CMD
no Momento da Execução
Você pode substituir o comando CMD
quando executar o contêiner:
Isso executará echo "Outro comando"
em vez do comando padrão definido em CMD
.
Usando CMD
como Argumento para ENTRYPOINT
Aqui, CMD
fornece o argumento padrão Hello, World!
para o comando echo
definido em ENTRYPOINT
. Se nenhum argumento for passado ao executar o contêiner, ele exibirá Hello, World!
. Você pode sobrescrever o argumento passando outro valor:
Isso executará echo "Outro texto"
.
Diferenças entre CMD
e ENTRYPOINT
CMD
e ENTRYPOINT
CMD
: Define comandos ou argumentos padrão, que podem ser facilmente substituídos durante a execução do contêiner.ENTRYPOINT
: Define o comando principal que será sempre executado, independentemente dos comandos passados na execução do contêiner.
Se você usar ambos em um Dockerfile, ENTRYPOINT
terá precedência sobre CMD
, e CMD
será usado apenas para fornecer argumentos ao ENTRYPOINT
.
Boas Práticas e Considerações
Comando Único: Um Dockerfile deve ter apenas uma instrução
CMD
. Se houver várias, apenas a última será aplicada.Flexibilidade: Use
CMD
quando quiser definir um comando ou argumento padrão que pode ser facilmente substituído. É útil em scripts ou contêineres onde o comportamento padrão pode ser alterado conforme a necessidade.Evitar Uso de Shell Form: Prefira a forma exec (
["comando", "arg1", "arg2"]
), pois ela é mais eficiente e não depende de um shell, o que pode adicionar sobrecarga e riscos de segurança.
Exemplo Avançado
Contêiner de Servidor Web com Comando Padrão
Aqui, CMD
define o comando padrão para iniciar o servidor NGINX em primeiro plano (daemon off;
), o que é útil para que o contêiner continue rodando.
Combinando ENTRYPOINT
e CMD
para Flexibilidade
Neste exemplo:
ENTRYPOINT
define o comando fixo para executar o script Python.CMD
fornece o argumento padrão--help
. Isso significa que, ao iniciar o contêiner sem argumentos adicionais, ele executará o script com a flag--help
. Porém, você pode sobrescrever esse comportamento passando outros argumentos na execução do contêiner.
Resumo
CMD
define um comando ou argumentos padrão para serem executados quando o contêiner é iniciado.Flexível:
CMD
pode ser substituído facilmente no momento da execução do contêiner, tornando-o útil para cenários onde o comando padrão deve ser ajustável.Uso com
ENTRYPOINT
:CMD
pode ser usado em conjunto comENTRYPOINT
para fornecer argumentos padrão ao comando fixo.
Last updated