Header Ads

Como usar o Cron com seus contêineres Docker

Executar tarefas em segundo plano em uma programação é um requisito padrão dos serviços de back-end. A configuração costumava ser simples – você definiria suas tarefas no crontab de seu servidor e encerraria o dia. Vejamos como você pode utilizar o cron enquanto usa o Docker para implantação.

Contêineres seus serviços aumentam a produtividade do desenvolvedor. Simultaneamente, pode deixar você se perguntando como as preocupações tradicionais do administrador de sistemas são mapeadas para os conceitos do Docker. Você tem várias opções ao usar o cron com contêineres do Docker e iremos explorá-las abaixo em ordem de adequação. Antes de continuar, certifique-se de ter criado uma imagem Docker do seu aplicativo.

Usando o Crontab do host

Basicamente, você sempre pode utilizar a instalação cron do host que está executando seu Docker Engine. Certifique-se de que o cron está instalado e edite o crontab do sistema normalmente.

Você pode usar o docker exec para executar um comando em um contêiner existente:

 * / 5 * * * * docker exec example_app_container /example-scheduled-task. sh

Isso só funcionará se você tiver certeza do nome do contêiner com antecedência. Normalmente é melhor criar um novo contêiner que exista exclusivamente para executar a tarefa:

 * / 5 * * * * docker run --rm example_app_image: último /example-scheduled-task. sh

A cada cinco minutos, a instalação do cron do seu sistema criará um novo contêiner do Docker usando a imagem do seu aplicativo. O Docker executará o script /example-scheduled-task. sh dentro do contêiner. O contêiner será destruído (--rm) assim que o script for encerrado.

Usando o Cron em seus contêineres

Usar o crontab do host interrompe a conteinerização do Docker, pois as tarefas agendadas requerem configuração manual em seu sistema. Você precisará garantir que o cron esteja instalado em cada host em que você implantar. Embora possa ser útil no desenvolvimento, você deve procurar integrar o cron aos seus serviços Dockerizados quando possível.

As imagens base do Docker mais populares não incluem o cron daemon por padrão. Você pode instalá-lo no Dockerfile e, em seguida, registrar o crontab do seu aplicativo.

Primeiro, crie um novo arquivo crontab dentro de sua base de código:

 * / 5 * * * * / usr / bin / sh /example-scheduled-task. sh

A seguir, corrija seu Dockerfile para instalar o cron e registrar seu crontab – aqui está como você pode fazer isso com uma imagem baseada em Debian:

 EXECUTE apt-get update & & apt-get install -y cron COPY example-crontab /etc/cron.d/example-crontab RUN chmod 0644 /etc/cron.d/example-crontab & & \ crontab /etc/cron.d/example-crontab 

Nós instalamos o cron e copiamos o crontab de nossa base de código &’ para o diretório /etc/cron.d. Em seguida, precisamos alterar as permissões em nosso crontab para garantir que ele esteja acessível ao cron. Finalmente, use o comando crontab para tornar o arquivo conhecido para o daemon cron.

Para concluir esta configuração, você precisará alterar o comando ou o ponto de entrada de sua imagem para iniciar o cron daemon quando os contêineres começarem a ser executados. Você não pode conseguir isso com um estágio RUN em seu Dockerfile porque essas são etapas transitórias que não persistem além da fase de construção da imagem. O serviço seria iniciado dentro do contêiner efêmero usado para construir a camada, não nos contêineres finais que executam a imagem concluída.

Se a única tarefa do seu contêiner for executar cron – que iremos discutir mais abaixo – você pode adicionar ENTRYPOINT ["cron", "-f"] ao seu Dockerfile para iniciá-lo como o processo de primeiro plano. Se você precisar manter outro processo em primeiro plano, como um servidor web, você deve criar um script de ponto de entrada dedicado (por exemplo, ENTRYPOINT ["bash", "init. sh"]) e adicionar o serviço cron start como um comando dentro desse arquivo .

Separando o Cron dos serviços de seu aplicativo

Implementar a configuração descrita na seção anterior fornece uma solução mais robusta do que confiar no crontab do host. Adicionar o cron daemon aos contêineres que atendem seu aplicativo garante que qualquer pessoa que consuma sua imagem Docker terá as tarefas programadas configuradas automaticamente.

Isso ainda resulta em uma mistura de preocupações. Seus contêineres acabam com duas responsabilidades – em primeiro lugar, para fornecer a funcionalidade do aplicativo e, em segundo lugar, para manter o cron ativo e executar as tarefas agendadas. Idealmente, cada contêiner deve fornecer uma unidade específica de funcionalidade.

Sempre que possível, você deve executar suas tarefas cron em um contêiner separado para seu aplicativo. Se você estiver criando um back-end da web, isso significaria um contêiner para fornecer seu servidor da web e outro que executa o cron em primeiro plano.

Sem essa separação, você não conseguirá usar um orquestrador como o Docker Swarm ou o Kubernetes para executar várias réplicas do seu aplicativo. Cada contêiner executaria seu próprio cron daemon, fazendo com que as tarefas agendadas fossem executadas várias vezes. Isso pode ser atenuado usando arquivos de bloqueio vinculados a um volume Docker compartilhado. No entanto, é mais sustentável resolver o problema raiz e introduzir um contêiner dedicado para o daemon do cron.

Geralmente, você deseja que os dois contêineres se baseiem na imagem do Docker de seu aplicativo. Cada um deles precisará de conexões com os volumes e redes do Docker do seu serviço. Isso garantirá que o contêiner cron tenha um ambiente idêntico ao contêiner do aplicativo, com a única diferença sendo o processo em primeiro plano.

Esta não é uma regra rígida – em alguns projetos, suas tarefas agendadas podem ser scripts triviais que operam independentemente de sua base de código. Nesse caso, o contêiner cron pode usar uma imagem de base mínima e eliminar conexões com recursos periféricos desnecessários.

Uma maneira de configurar um contêiner cron separado seria usar docker-compose. Você definiria o contêiner cron como um serviço extra. Você pode usar a imagem de base do seu aplicativo, substituindo o comando do ponto de entrada para iniciar o cron daemon. Usar docker-compose também simplifica a anexação do contêiner a quaisquer volumes e redes compartilhados necessários.

versão: " 3 "   services: app: image: demo-image: volumes mais recentes: - data: / app-data cron: image: imagem demo: ponto de entrada mais recente: / bin / bash command: [" cron & quot ;, " -f "] volumes : - data: / app-data   volumes: dados:

Usando o exemplo acima, um contêiner serve nosso aplicativo usando o ponto de entrada padrão na imagem. Certifique-se de que o cron daemon não seja iniciado! O segundo contêiner substitui o ponto de entrada da imagem para executar o cron. Contanto que a imagem ainda tenha o cron instalado e seu crontab configurado, você pode usar docker-compose para abrir seu aplicativo.

Usando tarefas cron do Kubernetes

Por fim, vejamos um exemplo simples de execução de tarefas agendadas no Kubernetes. O Kubernetes vem com seu próprio recurso CronJob, que você pode usar em seus manifestos.

Você não precisa instalar o cron na sua imagem ou configurar contêineres especializados se estiver usando o Kubernetes. Esteja ciente de que CronJob é um recurso beta que pode mudar em versões futuras do Kubernetes.

apiVersion: batch / v1beta1 kind: CronJob metadata: name: my-cron namespace: my-namespace spec: schedule: " * / 5 * * * * " concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: my-container image: my-image: Latest command: [" / bin / bash & quot ;, " /my-cron-script. sh"] restartPolicy : OnFailure

Aplique o manifesto acima ao seu cluster para criar um novo cron job que executará /my-cron-script. sh dentro do seu contêiner a cada cinco minutos. A frequência é fornecida como uma definição cron regular para a chave de programação na especificação do recurso.

Você pode personalizar a ConcurrencyPolicy para controlar se o Kubernetes permite que suas tarefas se sobreponham. O padrão é Permitir, mas pode ser alterado para Proibir (evitar que novos trabalhos sejam iniciados enquanto um já existe) ou Substituir (encerrar um trabalho existente assim que um novo iniciar).

Usar o recurso integrado do Kubernetes é a maneira recomendada de gerenciar tarefas agendadas em seus clusters. Você pode acessar facilmente os registros de tarefas e não precisa se preocupar em preparar seus contêineres para uso com o cron. Você só precisa produzir uma imagem Docker que contenha tudo que suas tarefas precisam para executar. O Kubernetes cuidará da criação e destruição de instâncias de contêiner de acordo com a programação que você especificar.

Nenhum comentário