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.
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 :)
Ó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