Maison > Questions et réponses > le corps du texte
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粉5638310522023-10-11 17:56:26
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粉8181258052023-10-11 16:39:03
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< 中所述< /a> : utilisez cron
LF 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>&1
2>&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-get
: apt-get
moins bruyante ?
apt-get -y install -qq --force-yes cron
apt-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 -f
cron -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