Introdução
Eu queria um container para executar meus cron jobs de uma forma que eu pudesse migrá-los facilmente para um novo servidor apenas executando um docker compose e que eu não tivesse que reconstruir a imagem toda vez que precisasse criar um novo cron job. Não encontrei a solução da maneira que eu queria, então eu mesmo a construí e, neste post, compartilharei como fazer isso.
Criando a imagem do docker
O container usa Alpine (você pode usar outro, mas o Alpine tem apenas 5 MB de tamanho), espera um arquivo /etc/cron/crontab que deve ser mapeado em um volume e executa o script start.sh na inicialização:
| |
⚠️ Como os scripts são executados no container, pode ser necessário instalar suas dependências no container, alterando o arquivo
Dockerfile. Por exemplo:
1RUN apk add openssh💡 Também podemos usar Docker-in-Docker ou Docker-out-of-Docker para criar um container para jobs que precisam de dependências específicas que não queremos instalar:
1docker run --rm busybox echo "Hello World"
O script start.sh adiciona o arquivo /etc/cron/crontab ao cron e inicia o daemon cron com o comando crond -f, que o instrui a ser executado em primeiro plano, imprimindo a saída para stdout:
| |
Executando o container
Primeiro, temos que criar o arquivo crontab (Detalhes sobre o formato do arquivo aqui).
Neste exemplo, existem duas tarefas:
| |
Se as tarefas executarem scripts, elas deverão ser mapeadas para o container em um volume. A maneira mais fácil é colocá-los no mesmo diretório do arquivo crontab. Neste exemplo, crontab e scripts estão no diretório ./cronjobs:
| |
Em seguida, no arquivo docker-compose.yaml, basta mapear o volume para o diretório /etc/cron/:
| |
💡 O stdout/stderr pode ser lido usando o comando
docker logs cronjobs.
