O ENTRYPOINT é uma das opções de configuração mais importantes do Docker. Encontra-se no Dockerfile e permite que você determine o comportamento padrão do contêiner. Essa capacidade torna o ENTRYPOINT extremamente útil para automatizar o comportamento dos contêineres em tempo de execução.

Este artigo explora detalhadamente o uso do ENTRYPOINT no Docker, incluindo como ele funciona, por que é essencial, e como configurá-lo corretamente.

Explicando o Docker ENTRYPOINT

O ENTRYPOINT serve como o ponto de partida para o processo de tempo de execução de um contêiner do Docker. Quando você cria uma imagem do Docker e a inicializa como um contêiner, o comando ENTRYPOINT é executado por padrão.

O ENTRYPOINT permite que você defina a finalidade principal do contêiner, tal como executar um servidor web, um banco de dados ou um aplicativo. Também permite passar argumentos em tempo de execução para personalizar o comportamento do contêiner.

Sintaxe e utilização do ENTRYPOINT

As duas opções de sintaxe para definir o ENTRYPOINT em um Dockerfile são a forma de shell e a forma de execução. Ambas as abordagens envolvem a inserção de uma linha no Dockerfile. Como a configuração do ENTRYPOINT não afeta diretamente o processo de build, você pode colocá-la em qualquer lugar do arquivo. No entanto, a maioria dos programadores tende a colocar o comando ENTRYPOINT perto do final.

Sintaxe da forma de shell

Quando o ENTRYPOINT é executado usando a forma de shell, ele invoca um shell de comando para processamento. Esse método inclui substituições de variáveis de ambiente, mas bloqueia a capacidade de anexar argumentos na forma de execução:

ENTRYPOINT command param1 param2

Aqui, command é o comando principal executado quando o contêiner é iniciado. param1 e param2 são argumentos para o comando.

Sintaxe da forma de execução

A forma de execução não invoca um shell de comando. Em vez disso, executa diretamente o comando e os parâmetros especificados. Esse método permite anexar argumentos via CMD ou linha de comando em tempo de execução:

ENTRYPOINT ["executable", "param1", "param2"]

Aqui, executable é o comando principal e param1 e param2 são argumentos para o executável.

O ENTRYPOINT em ação

Vamos montar um comando ENTRYPOINT simples para um Dockerfile para ver como ele funciona. Você não pode testá-lo sem iniciar seu contêiner, porque a instrução é processada em tempo de execução, não em tempo de build.

Aqui está um exemplo de uso da forma de execução:

ENTRYPOINT ["python", "app.py"]

Quando esse contêiner é iniciado, ele inicia um interpretador Python e executa o script app.py para atuar como o comportamento padrão do seu contêiner.

Para repetir esse exemplo com a forma de shell, você precisa fazer uma leve alteração:

ENTRYPOINT python app.py

Este exemplo inicia o interpretador Python a partir de um comando de shell em vez de executá-lo diretamente.

O ENTRYPOINT com CMD

CMD é uma instrução do Dockerfile que fornece os argumentos padrão para um contêiner em execução. Eles podem assumir a forma de um comando executável ou servir como parâmetros adicionais para a instrução ENTRYPOINT. Ao iniciar um contêiner, você pode substituir esses parâmetros fornecendo argumentos para o comando docker run.

Assim como no ENTRYPOINT, você pode escrever CMD na forma de execução ou de shell. A principal diferença é que o CMD define comandos ou parâmetros padrão que você pode substituir a partir da linha de comando. Já o ENTRYPOINT configura os contêineres para rodarem como executáveis, o que significa que você não pode substituir o comando a partir da linha de comando.

Você pode usar o CMD para estender a funcionalidade do ENTRYPOINT para dar mais flexibilidade à sua imagem. A combinação dos dois permite personalizar o comportamento da sua imagem, com os valores de CMD atuando como os argumentos padrão para a instrução ENTRYPOINT. Esse método permite que você defina um comando padrão por meio do ENTRYPOINT e argumentos padrão por meio do CMD.

Diferentemente do uso do ENTRYPOINT sozinho, essa abordagem permite substituir os parâmetros passados durante o comando docker run.

Para tornar o exemplo acima mais flexível, você pode incluir um comando CMD:

ENTRYPOINT ["python", "app.py"]
CMD ["--help"]

Neste exemplo, iniciar um contêiner do Docker sem fornecer nenhum argumento de linha de comando significa que python app.py --help será executado por padrão. Entretanto, fornecer argumentos ao iniciar o contêiner (tais como docker run <image> --version) irá substituir os argumentos padrão do CMD, resultando em python app.py --version. Essa abordagem oferece a você maior flexibilidade ao executar seus contêineres.

Casos de uso do ENTRYPOINT no Docker

O uso mais comum do ENTRYPOINT é a configuração de imagens para aplicativos ou serviços específicos. Por exemplo, se você criar uma imagem para executar um aplicativo Python, poderá usar o ENTRYPOINT para especificar que o interpretador Python deve ser executado.

Você também pode usar o ENTRYPOINT ao criar imagens do Docker para pipelines de integração contínua e implantação contínua (CI/CD). Você pode usar essas imagens para encapsular o ambiente necessário para cada estágio a fim de garantir a consistência. Por exemplo, você pode criar uma imagem do Docker com o ENTRYPOINT definido como script de teste. Essa imagem executa esses testes automaticamente sempre que é executada para fornecer um ambiente de teste consistente e repetível.

O ENTRYPOINT também é útil para depurar aplicativos conteinerizados. Ao iniciar uma sessão de shell com ENTRYPOINT, você pode interagir com o ambiente do aplicativo dentro do contêiner. Essas interações incluem a execução de comandos, exploração de arquivos e inspeção do estado do aplicativo. Uma vez resolvida a questão, você pode reconstruir a imagem do Docker com o ENTRYPOINT apropriado para executar o aplicativo.

Como substituir o ENTRYPOINT

É possível substituir o ENTRYPOINT de uma imagem Docker em tempo de execução para obter flexibilidade adicional. Você pode fazer isso fornecendo um comando após o nome da imagem no comando docker run.

Por exemplo, se sua imagem tem um script Python como ENTRYPOINT, mas em vez disso você quiser abrir um shell dentro do contêiner, poderá executar o seguinte:

docker run --entrypoint <image> “/bin/bash”

Esse script substitui o ENTRYPOINT padrão do aplicativo e inicia um Bash shell.

Da mesma forma, para executar um script Python diferente, você pode fornecer esse script como sendo o comando. Essa tática oferece a você a flexibilidade de executar o seu contêiner com um parâmetro diferente daqueles originalmente descritos no ENTRYPOINT do seu Dockerfile.

Práticas recomendadas de uso do ENTRYPOINT no Docker

Visto que o ENTRYPOINT é um comando tão crucial para o Docker, é importante seguir estas práticas recomendadas para maximizar seu uso.

Mantenha os contêineres concentrados em uma única responsabilidade

O ENTRYPOINT especifica as responsabilidades do seu contêiner Docker. Como microsserviços, cada contêiner deve se concentrar em uma única responsabilidade, serviço ou parte de um aplicativo. Essa abordagem aumenta a modularidade e a escalabilidade do seu aplicativo, facilitando o desenvolvimento, teste e manutenção.

Certifique-se de que os scripts do ENTRYPOINT sejam executáveis e formatados corretamente

Fazer os scripts do ENTRYPOINT executáveis e formatados corretamente pode evitar problemas como erros de sintaxe e permissão.

Para assegurar que os scripts ENTRYPOINT sejam executáveis, você pode usar a seguinte instrução RUN chmod +x:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

Este exemplo copia o script entrypoint.sh para o contêiner e usa a instrução RUN chmod +x para torná-lo executável. Em seguida, define o ENTRYPOINT para usar o script entrypoint.sh.

Você também pode usar um linter como ShellCheck para verificar a sintaxe e o estilo dos scripts e garantir a formatação adequada.

Evite valores de codificação fixa nos scripts ENTRYPOINT

Usar variáveis de ambiente ou argumentos de linha de comando em vez de codificação fixa pode tornar seus scripts mais flexíveis. Isso também permite configurar o caminho do arquivo de fora do contêiner.

Por exemplo, em vez de codificar de forma fixa um caminho de arquivo no script ENTRYPOINT desta forma:

#!/bin/bash
echo "Starting my application..."
./my-app -f /path/to/my/file.txt

Você pode usar uma variável como esta:

#!/bin/bash
echo "Starting my application..."
./my-app -f "${MY_FILE}"

O uso de variáveis proporciona à sua imagem maior capacidade de personalização em tempo real, permitindo que você faça mais sem ter de reescrever seu Dockerfile.

O Docker e a Kinsta trabalham juntos

A Kinsta oferece uma plataforma poderosa e flexível para implantar aplicativos web usando o Docker. Ela ajuda você a criar e implantar imagens personalizadas do Docker para obter maior controle e flexibilidade do seu ambiente de hospedagem.

Quer você esteja criando um ambiente de hospedagem personalizado ou redimensionando seu aplicativo para lidar com mais tráfego, a Kinsta fornece as ferramentas e o suporte de que você precisa para ser bem-sucedido.

Resumo

O ENTRYPOINT é uma ferramenta essencial para configurar contêineres do Docker. Ele define o comando padrão que é executado quando um contêiner é iniciado a partir de uma imagem, definindo sua função principal. Você pode usar ENTRYPOINT para executar aplicativos específicos, ajudar em pipelines CI/CD, ou combinar com CMD para um comportamento mais flexível do contêiner.

Atualmente, o Docker é a ferramenta de desenvolvimento mais popular, o que o torna essencial para diversas implantações em contêineres. Para saber mais sobre o Docker, navegue pelos artigos da Kinsta e confira a Kinsta para a hospedagem de seus aplicativos conteinerizados.

A Kinsta torna seu fluxo de trabalho de desenvolvimento mais fácil e eficiente. Recursos como aplicativos conteinerizados na infraestrutura do GCP executados em máquinas C2 com 37 centros de dados disponíveis, integração premium com o Cloudflare para uma CDN de alto desempenho que atende ao seu site a partir de 260+ Pontos de Presença (PoPs), padrão corporativo em proteção de firewall contra DDoS, Edge Caching e monitoramento de tempo de atividade (com garantia de 99% de tempo de atividade), asseguram que seu aplicativo seja executado de forma rápida, segura, e esteja disponível de maneira confiável na internet.

Marcia Ramos Kinsta

Sou o líder da equipe editorial na Kinsta. Sou um entusiasta de código aberto e adoro programar. Com mais de 7 anos de experiência em redação e edição técnica para a indústria de tecnologia, adoro colaborar com pessoas para criar conteúdos claros e concisos e melhorar fluxos de trabalho.