Docker :: Criando um Container para Execução de Crontabs

Share:

Criando um container para execução de Crontabs 

Neste exemplo vou estar passando um cookbook de como criar um Container Docker responsável por executar crontabs específicas no Linux. Esta é um exemplo bem cru, você deve customizar os arquivos de exemplo e configuração com as dependências e comandos para atender a sua necessidade. Estaremos utilizando um container base rodando Ubuntu 16.04, mas as crontabs são universais pra praticamente todo sistema Linux, então você pode selecionar qual distribuição preferir ajustando os parâmetros para mesma. 

Você deverá criar uma estrutura de diretórios similar a abaixo, onde deve existir uma pasta chamada "crontabs" que vai ser mapeada como um volume para dentro da pasta de configurações do Cron. Nesta pasta iremos guardar os arquivos texto que vão ter as crontabs escritas. Mapeie mais volumes para adicionar seus scripts a vontade, para o exemplo estarei adicionado uma pasta "scripts".

Esse exemplo pode ser adaptado para montar servidores de cron, que requisita URL's, realiza backups, consome ou atualiza API's e etc. Existem N possibilidades. 



Dockerfile 

Para subir o container, irei utilizar o Ubuntu 16.04. Mas como foi dito, customize como preferir :D.

 FROM ubuntu:16.04
 MAINTAINER 

 RUN touch /var/log/cron.log

 RUN apt-get update \
     && apt-get -y install cron

 CMD ["cron && tail -f /var/log/cron.log"]

docker-compose.yml

Agora vamos orquestrar nosso container da melhor forma possível. De forma com que ele sempre inicie junto com o sistema. Vamos buildar nosso projeto utilizando o docker-compose. 
 version: '2'
services:
  crontab:
    build: .
    volumes:
      - ./crontabs:/etc/cron.d
      - ./scripts:/var/scripts

Crie um pasta chamada crontabs dentro da pasta do projeto. E dentro crie um arquivo qualquer. Esse arquivo será utilizado para fazer o apontamento das crontabs.

crontab/crontabs

A crontab de exemplo é essa abaixo. Basicamente roda dois crons a cada minuto. Uma crontab direta e um script de exemplo. 
 * * * * * root echo "Exemplo de Comando" >> /var/log/cron.log 2>&1  
 * * * * * root chmod +x /var/scripts -R ; /var/scripts/exemplo.sh >> /var/log/cron.log 2>&1  

scripts/exemplo.sh 

 #!/bin/bash  
 uptime;  
 echo "Exemplo de Script"  


Rodando o Container 

Dentro da pasta do projeto, vamos iniciar o docker-compose build e em seguida um up para iniciar o processo dos containers.
 # docker-compose build   

Em seguida, vamos subir o projeto com o up. Utilize a opção -d para rodar em segundo plano:
 # docker-compose up 


Liberei todos os arquivos de configuração neste link do Git. Estou fazendo um repositório com os meus ambientes lá.

Vou começar a postar algum material sobre Docker. Assunto bastante presente nos meus dias de DevOps e inclusive do meu TCC. Espero ter ajudado :)

Links de ajuda: 




Um comentário:

  1. Ótimo post Matheus, gostaria de uma sugestão para um ambiente que tenho com muitos contêineres rodando crons com mapeamento de pastas no host com os scripts e acontece bastante do cron congelar nos contêineres só volta a executar se eu recriar o serviço no docker.

    ResponderExcluir