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:
1
RUN 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:
1
docker 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
.