Προσπαθώ να εκτελέσω μια εργασία cronjob μέσα σε ένα δοχείο docker που καλεί ένα σενάριο κελύφους.
Χθες έψαξα σε όλο το διαδίκτυο και στο stack overflow, αλλά δεν μπόρεσα να βρω πραγματικά μια λύση που να λειτουργεί.
Πώς μπορώ να το κάνω αυτό;
EDIT:
Έχω δημιουργήσει ένα (σχολιασμένο) αποθετήριο github με ένα λειτουργικό δοχείο docker cron που καλεί ένα σενάριο κελύφους σε συγκεκριμένο χρονικό διάστημα.
Μπορείτε να αντιγράψετε την crontab σας σε μια εικόνα, ώστε το κοντέινερ που θα εκκινηθεί από την εν λόγω εικόνα να εκτελέσει την εργασία.
Δείτε το "Εκτέλεση μιας εργασίας cron με το Docker" από τον Julien Boulay στο Ekito/docker-cron
:
Ας δημιουργήσουμε ένα νέο αρχείο με όνομα "
hello-cron
" για να περιγράψουμε την εργασία μας.
* * * * * 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.
Το ακόλουθο αρχείο Docker περιγράφει όλα τα βήματα για τη δημιουργία της εικόνας σας
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
(βλέπε Gaafar's comment και How do I make apt-get
install less noisy?:
Το apt-get -y install -qq --force-yes cron
μπορεί επίσης να λειτουργήσει)
Ή, βεβαιωθείτε ότι η ίδια η εργασία σας ανακατευθύνεται απευθείας στο stdout/stderr αντί για ένα αρχείο καταγραφής, όπως περιγράφεται στην hugoShaka's απάντηση:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Αντικαταστήστε την τελευταία γραμμή του Dockerfile με
CMD ["cron", "-f"]
Δείτε επίσης (σχετικά με το cron -f
, δηλαδή το cron "foreground") "docker ubuntu cron -f
δεν λειτουργεί",
Κατασκευάστε και εκτελέστε το:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Κάντε υπομονή, περιμένετε 2 λεπτά και η γραμμή εντολών σας θα πρέπει να εμφανιστεί:
Hello world
Hello world
Ο Eric προσθέτει στα σχόλια:
Σημειώστε ότι το
tail
μπορεί να μην εμφανίζει το σωστό αρχείο αν δημιουργείται κατά τη διάρκεια της δημιουργίας της εικόνας.
Αν συμβαίνει αυτό, θα πρέπει να δημιουργήσετε ή να αγγίξετε το αρχείο κατά τη διάρκεια της εκτέλεσης του εμπορευματοκιβωτίου, ώστε η tail να εντοπίσει το σωστό αρχείο.
Δείτε "Η έξοδος του tail -f
στο τέλος ενός docker CMD
δεν εμφανίζεται".
Δημιούργησα μια εικόνα Docker με βάση τις άλλες απαντήσεις, η οποία μπορεί να χρησιμοποιηθεί όπως
docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron
όπου /path/to/cron
: απόλυτη διαδρομή προς το αρχείο crontab, ή μπορείτε να το χρησιμοποιήσετε ως βάση σε ένα αρχείο Docker:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Για αναφορά, η εικόνα είναι εδώ.
Οι εργασίες Cron αποθηκεύονται στο /var/spool/cron/crontabs (Κοινό μέρος σε όλες τις διανομές που γνωρίζω). BTW, Μπορείτε να δημιουργήσετε μια καρτέλα cron στο bash χρησιμοποιώντας κάτι τέτοιο:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Αυτό θα δημιουργήσει ένα προσωρινό αρχείο με την εργασία cron, και στη συνέχεια θα την προγραμματίσετε χρησιμοποιώντας την crontab. Η τελευταία γραμμή αφαιρεί το προσωρινό αρχείο.