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:

  1. 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"]
  2. Shell Form (Forma Shell): Usando uma string, executa o comando dentro de um shell.

    CMD command param1 param2
  3. Argumentos para ENTRYPOINT: Usado para fornecer argumentos padrão quando combinado com ENTRYPOINT.

    CMD ["param1", "param2"]

Funcionalidade do 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 com ENTRYPOINT, CMD fornece argumentos padrão para o comando especificado no ENTRYPOINT.

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: 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 com ENTRYPOINT para fornecer argumentos padrão ao comando fixo.

Last updated