Bir kabuk betiğini çağıran bir docker konteynerinin içinde bir cronjob çalıştırmaya çalışıyorum.
Dün tüm web'de ve stack overflow'da arama yaptım, ancak gerçekten işe yarayan bir çözüm bulamadım.
Bunu nasıl yapabilirim?
EDIT:
Belirli aralıklarla bir kabuk betiğini çağıran çalışan bir docker cron konteyneri ile bir (yorumlanmış) github deposu oluşturdum.
Söz konusu imajdan başlatılan konteynerin işi çalıştırması için crontab'ınızı bir imaja kopyalayabilirsiniz.
Bakınız "Docker ile bir cron işi çalıştırın" Julien Boulay'den Ekito/docker-cron
:
İşimizi tanımlamak için "
hello-cron
" adında yeni bir dosya oluşturalım.
* * * * * 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.
Aşağıdaki Dockerfile, görüntünüzü oluşturmak için tüm adımları açıklar
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
(bkz. Gaafar's comment ve How do I make apt-get
install less noisy?:
apt-get -y install -qq --force-yes cron` da işe yarayabilir)
VEYA, hugoShaka'nın cevap'de açıklandığı gibi, işinizin bir günlük dosyası yerine doğrudan stdout/stderr'ye yönlendirildiğinden emin olun:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Son Dockerfile satırını şu şekilde değiştirin
CMD ["cron", "-f"]
Ayrıca bakınız (cron "foreground" demek olan cron -f
hakkında) "docker ubuntu cron -f
çalışmıyor"
Kurun ve çalıştırın:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Sabırlı olun, 2 dakika bekleyin ve komut satırınız görüntülenmelidir:
Hello world
Hello world
Eric yorumlarda ekliyor:
İmaj oluşturma sırasında oluşturulmuşsa
tail
dosyasının doğru dosyayı göstermeyebileceğini unutmayın.
Bu durumda, tail'in doğru dosyayı alması için konteyner çalışma zamanı sırasında dosyayı oluşturmanız veya dosyaya dokunmanız gerekir.
Bkz: "Bir docker CMD
nin sonundaki tail -f
çıktısı gösterilmiyor".
Diğer cevaplara dayanarak, aşağıdaki gibi kullanılabilecek bir Docker görüntüsü oluşturdum
docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron
burada /path/to/cron
: crontab dosyasının mutlak yolu veya bunu bir Dockerfile içinde temel olarak kullanabilirsiniz:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Referans için görsel burada.
Cron işleri /var/spool/cron/crontabs içinde saklanır (Bildiğim tüm dağıtımlarda ortak yer). BTW, Bunun gibi bir şey kullanarak bash içinde bir cron sekmesi oluşturabilirsiniz:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Bu, cron görevi ile geçici bir dosya oluşturacak, ardından crontab kullanarak programlayacaktır. Son satır geçici dosyayı kaldırır.