web-dev-qa-db-fra.com

Comment exécuter un travail cron dans un conteneur Docker

J'ai essayé d'exécuter un travail cron dans un conteneur docker

mais rien ne fonctionne pour moi

mon conteneur n'a que les fichiers cron.daily et cron.weekly

crontab, cron.d, cron.hourly ... sont absents dans mon conteneur

crontab -e ne fonctionne pas non plus

mon conteneur fonctionne avec/bin/bash

25
Manoj Kalluri

Voici comment j'exécute l'un de mes conteneurs cron.

Dockerfile:

FROM Alpine:3.3

ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt

CMD ["/entry.sh"]

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log

entry.sh

#!/bin/sh

# start cron
/usr/sbin/crond -f -l 8

script.sh

#!/bin/sh

# code goes here.
echo "This is a script, run by cron!"

Construisez comme ça

docker build -t mycron .

Courez comme ça

docker run -d mycron

Ajoutez vos propres scripts et éditez le crontab.txt et créez simplement l'image et exécutez. Puisqu'il est basé sur Alpine, l'image est super petite.

76
Ken Cochrane

merci pour ce modèle.

Je me demande seulement une ligne dans entry.sh

/usr/sbin/crond -f -L 8

crond -help donne:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR

        -f      Foreground
        -b      Background (default)
        -S      Log to syslog (default)
        -l N    Set log level. Most verbose:0, default:8
        -d N    Set log level, log to stderr
        -L FILE Log to FILE
        -c DIR  Cron dir. Default:/var/spool/cron/crontabs

alors peut-être que vous vouliez plutôt mettre le petit l

/usr/sbin/crond -f -l 8

istead du grand "L"

/usr/sbin/crond -f -L 8

pour définir le niveau de journal par défaut, car en spécifiant un fichier journal appelé 8 ne semble pas être destiné.

14
TVK

crond fonctionne bien avec tiny sur Alpine

RUN apk add --no-cache tini

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]

mais ne doit pas être exécuté en tant que processus principal de conteneur (PID 1) en raison d'un problème de récolte de zombies et de problèmes de gestion du signal. Voir ce Docker PR et ce billet de blog pour plus de détails.

3
Jarek Przygódzki