ENTRYPOINT

A instrução ENTRYPOINT em um Dockerfile define o comando que será executado quando um contêiner iniciado a partir da imagem é executado. Diferente de CMD, que também define um comando a ser executado, ENTRYPOINT permite configurar um contêiner para sempre executar como um executável específico, enquanto ainda permite que você passe argumentos adicionais no momento da execução do contêiner.

Sintaxe Básica

O ENTRYPOINT pode ser definido de duas formas:

  1. Exec Form (Forma Exec): Usando um array, que é a forma recomendada porque não envolve a utilização de um shell.

    ENTRYPOINT ["executable", "param1", "param2"]
  2. Shell Form (Forma Shell): Usando uma string, que será executada dentro de um shell.

    ENTRYPOINT command param1 param2

Diferença entre ENTRYPOINT e CMD

  • ENTRYPOINT: Define o comando principal e obrigatório que sempre será executado quando o contêiner iniciar.

  • CMD: Pode fornecer argumentos padrão ao comando especificado em ENTRYPOINT ou definir um comando a ser executado se ENTRYPOINT não estiver definido.

Se ambos estiverem presentes no Dockerfile:

  • ENTRYPOINT define o comando a ser executado.

  • CMD fornece os argumentos padrão para o comando especificado em ENTRYPOINT, mas pode ser sobrescrito na linha de comando.

Exemplos de Uso

Definindo um Comando Principal

FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]

Neste exemplo, ao executar o contêiner, ele sempre executará o comando echo Hello. Você pode passar argumentos adicionais ao contêiner, que serão anexados ao comando echo.

Saída:

Usando CMD com ENTRYPOINT

Neste caso, o ENTRYPOINT define o comando principal (echo Hello), enquanto o CMD fornece um argumento padrão (World). Quando o contêiner é executado sem argumentos adicionais, ele executará echo Hello World. Se você passar um argumento ao contêiner, ele substituirá o valor de CMD:

Saída:

Combinando ENTRYPOINT com CMD para um Script Personalizado

Aqui, ENTRYPOINT define o comando que executa o script Python. CMD fornece um argumento padrão --help, que será utilizado se nenhum outro argumento for passado durante a execução do contêiner. Isso permite que o contêiner seja usado como uma ferramenta de linha de comando.

Isso executará:

Overriding ENTRYPOINT

Se você quiser substituir o ENTRYPOINT ao executar o contêiner, você pode usar a flag --entrypoint:

Isso inicia o contêiner com o bash em vez do comando definido no ENTRYPOINT.

Boas Práticas e Considerações

  • Evitar Uso de Shell Form: A forma exec (["comando", "arg1", "arg2"]) é preferível porque não depende de um shell, o que é mais eficiente e seguro.

  • Comandos Curto e Claro: Mantenha o comando ENTRYPOINT simples e direto, para que seja fácil substituir ou complementar o comportamento esperado no momento da execução do contêiner.

  • Uso Combinado com CMD: Combine ENTRYPOINT e CMD para fornecer comportamento padrão e ao mesmo tempo permitir que o usuário do contêiner personalize a execução passando diferentes argumentos.

  • Flexibilidade: Se o contêiner deve sempre executar um comando específico, use ENTRYPOINT. Para mais flexibilidade, onde o comando pode ser alterado frequentemente, CMD pode ser mais apropriado.

Exemplo Avançado

Usando ENTRYPOINT para um Contêiner de Backup

Aqui, o contêiner sempre executará o comando rsync -avz para sincronizar arquivos entre diretórios. Os usuários podem passar os diretórios de origem e destino como argumentos quando executarem o contêiner.

Resumo

  • ENTRYPOINT define o comando principal a ser executado quando o contêiner inicia, tornando o contêiner mais parecido com um executável.

  • Combinação com CMD: Utilize CMD para fornecer argumentos padrão que podem ser substituídos, mantendo ENTRYPOINT como o comando fixo.

  • Segurança e Eficiência: Prefira a forma exec para evitar o uso desnecessário de um shell.

Last updated