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.
CMD ["executable", "param1", "param2"]Shell Form (Forma Shell): Usando uma string, executa o comando dentro de um shell.
CMD command param1 param2Argumentos para
ENTRYPOINT: Usado para fornecer argumentos padrão quando combinado comENTRYPOINT.CMD ["param1", "param2"]
Funcionalidade do CMD
CMDComando Padrão:
CMDdefine 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,CMDfornece argumentos padrão para o comando especificado noENTRYPOINT.
Exemplos de Uso
Definindo um Comando Padrão
FROM ubuntu:20.04
CMD ["echo", "Hello, World!"]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 ENTRYPOINTCMD: 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
CMDquando 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:
ENTRYPOINTdefine o comando fixo para executar o script Python.CMDfornece 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
CMDdefine um comando ou argumentos padrão para serem executados quando o contêiner é iniciado.Flexível:
CMDpode 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:CMDpode ser usado em conjunto comENTRYPOINTpara fornecer argumentos padrão ao comando fixo.
Last updated