Exécuter des tâches cron dans des conteneurs Docker : un guide étape par étape
P粉914731066
P粉914731066 2023-10-10 18:54:39
0
2
592

J'essaie d'exécuter une tâche cron dans un conteneur Docker qui appelle un script shell.

J'ai effectué des recherches en ligne et sur stack overflow hier, mais je ne trouve pas de solution qui fonctionne vraiment.

Comment puis-je faire ceci?

P粉914731066
P粉914731066

répondre à tous(2)
P粉563831052

Réponse acceptée peut être dangereuse dans un environnement de production.

Lorsque vous utilisez CMD cron && tail -f /var/log/cron.log时,cron进程基本上会分叉以便在后台执行cron,主进程退出并让您在前台执行 tailf . Le processus cron en arrière-plan peut s'arrêter ou échouer sans que vous vous en rendiez compte, votre conteneur s'exécutera toujours en mode silencieux et votre outil d'orchestration ne le redémarrera pas.

En utilisant la redirection shell de base, vous souhaiterez peut-être faire quelque chose comme ceci :

* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Votre CMD sera : CMD ["cron", "-f"]

Mais : que se passe-t-il si vous souhaitez exécuter la tâche en tant qu'utilisateur non root .

P粉818125805

Vous pouvez copier crontab dans une image afin que les conteneurs lancés à partir de cette image exécutent le travail.


Important : Comme dans docker-cron numéro 3 : utilisez cronLF pour fichiers, pas CRLF.


Voir Exécuter des tâches cron avec Docker” /github.com/julienboulay" rel="noreferrer">Julien Boulay dans son Ekito/docker-cron :

# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows)
* * * * * 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.

Si vous vous demandez ce qu'est 2>&12>&1, Ayman Hourieh explique.

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

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

Cependant : si cron meurt, le conteneur continue de fonctionner .

(voir le commentaire de Gaafar et Comment rendre l'installation de apt-getapt-get moins bruyante ?  :
apt-get -y install -qq --force-yes cronapt-get -y install -qq --force-yes cron fonctionne également)

Comme Nathan Lloyd l'a commenté sur  :


Alternativement, assurez-vous que votre travail lui-même redirige directement vers stdout/stderr plutôt que vers un fichier journal, comme mentionné dans la réponse de hugoShaka :

* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Remplacez la dernière ligne du Dockerfile par

CMD ["cron", "-f"]

Mais : que se passe-t-il si vous souhaitez exécuter la tâche en tant qu'utilisateur non root .

Voir aussi (à propos de cron -fcron -f,即cron“前台”)“docker ubuntu cron -f, le "frontend" cron) "docker ubuntu cron -f Non je travaille


Construisez-le et exécutez-le :
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Hello world
Hello world

Eric a ajouté dans les commentaires

 : 🎜

Voir "docker CMD”末尾的 tail -f sortie > non affiché ".


Voir "Exécuter Cron dans Docker" pour plus d'informations (avril 2021) de Jason Kulatunga comme il commenté ci-dessous

Voir les images de Jason AnalogJ/docker-cron Basé sur :

  • Installation Dockerfile cronie/crond, selon la distribution.

  • Le point d'entrée s'initialise /etc/environment puis appelle

    cron -f -l 2
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal