Featured image of post Como executar cron jobs em um container para fácil portabilidade

Como executar cron jobs em um container para fácil portabilidade

Criando um container para executar cron jobs

Introdução Link to this section

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 Link to this section

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM alpine:3.14

RUN mkdir /etc/cron
RUN touch /etc/cron/crontab

ADD start.sh /
RUN chmod +x /start.sh

VOLUME /etc/cron

ENTRYPOINT ["sh", "/start.sh"]

⚠️ 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:

1
2
3
4
#!/bin/bash

crontab /etc/cron/crontab
crond -f

Executando o container Link to this section

Primeiro, temos que criar o arquivo crontab (Detalhes sobre o formato do arquivo aqui).

Neste exemplo, existem duas tarefas:

1
2
3
# min   hour    day     month   weekday command
0       *       *       *       *       /bin/sh /etc/cron/task1.sh
0       0       *       *       *       /bin/sh /etc/cron/task2.sh

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:

1
2
3
4
5
6
7
8
.
├── Dockerfile
├── docker-compose.yml
├── start.sh
└── cronjobs
    ├── crontab
    ├── task1.sh
    └── task2.sh

Em seguida, no arquivo docker-compose.yaml, basta mapear o volume para o diretório /etc/cron/:

1
2
3
4
5
6
7
services:
  cronjobs:
    build: .
    container_name: cronjobs
    volumes:
      - ./cronjobs/:/etc/cron/
    restart: unless-stopped

💡 O stdout/stderr pode ser lido usando o comando docker logs cronjobs.

Referências Link to this section

💬 Like or have something to add? Leave a comment below.
Ko-fi
GitHub Sponsor
Licensed under CC BY-NC-SA 4.0
Criado com Hugo
Tema Stack desenvolvido por Jimmy