A instrução ENTRYPOINT
do Docker é uma ferramenta poderosa para definir o processo principal do seu contêiner. Dominar seu uso, em conjunto com a instrução CMD
, é essencial para construir imagens Docker robustas e reutilizáveis. Este artigo explora ENTRYPOINT
e suas aplicações práticas.
Sumário
- Entendendo a instrução
ENTRYPOINT
- Passando argumentos para
ENTRYPOINT
ENTRYPOINT
vs.CMD
: Uma comparação detalhada- Exemplos práticos e melhores práticas
- Conclusão
Entendendo a instrução ENTRYPOINT
A instrução ENTRYPOINT
em um Dockerfile designa o executável principal lançado quando um contêiner inicia. Define a funcionalidade principal do contêiner. Diferentemente de CMD
, os argumentos fornecidos a ENTRYPOINT
não são sobrescritos por comandos docker run
; em vez disso, eles são combinados com argumentos de tempo de execução. Isso garante um processo base consistente e previsível, permitindo a personalização em tempo de execução.
Por exemplo, uma imagem de servidor web pode usar:
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Isso garante que o Apache seja executado em primeiro plano, independentemente de como o contêiner é iniciado. Os argumentos -D FOREGROUND
são inerentes à imagem.
Passando argumentos para ENTRYPOINT
O verdadeiro poder de ENTRYPOINT
reside em sua capacidade de aceitar argumentos do comando docker run
. Estes são anexados ao comando ENTRYPOINT
, permitindo a personalização sem alterar a imagem.
Considere este Dockerfile
:
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["echo $1 && date"]
Executar docker run my-image "Olá do ENTRYPOINT!"
imprimirá “Olá do ENTRYPOINT!” seguido pela data e hora atuais. O argumento “Olá do ENTRYPOINT!” é passado para o shell e executado pelo comando echo
. O comando date
do CMD
também é executado.
Um exemplo mais sofisticado é um script que recebe um número de porta:
#!/bin/bash
PORT="${1:-8080}" # Use 8080 como padrão se nenhum argumento for fornecido.
echo "Iniciando servidor na porta: $PORT"
# ... lógica do servidor usando $PORT ...
ENTRYPOINT
vs. CMD
: Uma comparação detalhada
ENTRYPOINT
define o processo principal; CMD
fornece argumentos padrão para esse processo. Se ambos estiverem presentes, os argumentos docker run
são anexados ao comando ENTRYPOINT
, substituindo os argumentos CMD
. Se apenas CMD
for especificado, ele atua como o processo principal. Use ENTRYPOINT
para a funcionalidade principal e CMD
para padrões ou opções facilmente substituíveis.
Exemplos práticos e melhores práticas
Exemplo 1: Um aplicativo Python simples
COPY . /app
WORKDIR /app
ENTRYPOINT ["python3", "my_app.py"]
Isso executa seu aplicativo Python diretamente. Quaisquer argumentos para docker run
serão passados para my_app.py
.
Exemplo 2: Usando um shell para comandos mais complexos
ENTRYPOINT ["/bin/bash", "-c"]
CMD ["npm start"]
Aqui, você pode começar com um shell e então executar qualquer comando necessário, seja padrão (npm start
) ou substituído de docker run
.
Melhores práticas:
- Use
ENTRYPOINT
para o comando principal. - Use
CMD
para argumentos padrão ou configurações facilmente alteráveis. - Sempre trate os argumentos com segurança dentro do seu script
ENTRYPOINT
, verificando a validade e fornecendo mensagens de erro informativas.
Conclusão
ENTRYPOINT
é uma instrução Docker fundamental, permitindo a criação de imagens de contêiner robustas, reutilizáveis e adaptáveis. Entender sua interação com CMD
é crucial para o desenvolvimento de aplicativos em contêiner eficazes. Ao elaborar cuidadosamente suas instruções ENTRYPOINT
e CMD
, você pode construir imagens Docker mais confiáveis e fáceis de manter.