Estou a tentar executar um cronjob dentro de um contentor portuário que invoca um script de shell.
Ontem estive procurando por toda a web e transbordamento de pilhas, mas não consegui encontrar uma solução que funcionasse.
Como é que eu posso fazer isto?
EDIT:
I'criei um (comentado) repositório github com um cron container que invoca um script shell em um determinado intervalo.
Você pode copiar sua crontab em uma imagem, para que o recipiente lançado a partir dessa imagem possa executar o trabalho.
Veja "Execute um cron job com Docker" de Julien Boulay no seu **Ekito/docker-cron
***:
Vamos criar um novo ficheiro chamado "
hello-cron
" para descrever o nosso trabalho.
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
O seguinte Dockerfile descreve todos os passos para construir a sua imagem
FROM ubuntu:latest
MAINTAINER [email protected]
RUN apt-get update && apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron
# Apply cron job
RUN crontab /etc/cron.d/hello-cron
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
(veja Gaafar's comment and How do I make apt-get
install less noisy?:
apt-get -y install -qq --force-yes cron
também pode funcionar)
OU, certifique-se de que seu trabalho seja redirecionado diretamente para stdout/stderr ao invés de um arquivo de log, como descrito em hugoShaka's resposta:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Substitua a última linha Dockerfile por
CMD ["cron", "-f"]
Veja também (sobre cron -f', que é dizer cron "foreground") "[docker ubuntu
cron -f' não está funcionando]9"
Construir e gerir:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Seja paciente, aguarde 2 minutos e a sua linha de comando deve ser exibida:
Hello world
Hello world
Eric acrescenta nos comentários:
Note que o
tail
pode não exibir o arquivo correto se ele for criado durante a construção da imagem.
Se for esse o caso, você precisa criar ou tocar no arquivo durante o tempo de execução do contêiner para que a cauda pegue o arquivo correto.
Veja "Output of tail -f
at the end of a docker CMD
is not showing".
Eu criei uma imagem Docker baseada nas outras respostas, que pode ser usada como
docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron
onde /path/to/cron
: caminho absoluto para o arquivo crontab, ou você pode utilizá-lo como base em um Dockerfile:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Para referência, a imagem está aqui.
Os trabalhos em Cron são armazenados em /var/spool/cron/crontabs (local comum em todas as distros que conheço). BTW, Você pode criar uma aba cron em bash usando algo assim:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Isto irá criar um arquivo temporário com a tarefa cron e depois programá-lo usando o crontab. Última linha remove o arquivo temporário.