recherche

Maison  >  Questions et réponses  >  le corps du texte

Exécuter des tâches cron dans des conteneurs Docker : un guide étape par étape

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粉914731066P粉914731066430 Il y a quelques jours585

répondre à tous(2)je répondrai

  • P粉563831052

    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 .

    répondre
    0
  • P粉818125805

    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 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 CMDtail -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

    répondre
    0
  • Annulerrépondre