Configurer un cron en parallèle à un travail ponctuel
Créez un fichier de script, par exemple run.sh, avec le travail qui est censé s'exécuter périodiquement.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Sauvegarder et quitter.
Utilisez Entrypoint au lieu de CMD
Si vous avez plusieurs tâches à lancer pendant la conteneurisation du docker, utilisez le fichier de point d'entrée pour les exécuter toutes.
Le fichier Entrypoint est un fichier de script qui entre en action lorsqu'une commande d'exécution de docker est émise. Ainsi, toutes les étapes que nous voulons exécuter peuvent être placées dans ce fichier de script.
Par exemple, nous avons 2 tâches à exécuter:
Exécuter une fois le travail : echo "Docker container has been started"
Exécuter un travail périodique : run.sh
Créez entrypoint.sh
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
# Setup a cron schedule
echo "* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Comprenons la crontab qui a été configurée dans le fichier
* * * * *
: Horaire Cron; le travail doit s'exécuter toutes les minutes. Vous pouvez mettre à jour le calendrier en fonction de vos besoins.
/run.sh
: Chemin d'accès au fichier de script à exécuter périodiquement
/var/log/cron.log
: Nom de fichier pour enregistrer la sortie du travail cron planifié.
2>&1
: Les journaux d'erreurs (le cas échéant) seront également redirigés vers le même fichier de sortie utilisé ci-dessus.
Remarque : N'oubliez pas d'ajouter une nouvelle ligne supplémentaire, car cela en fait un cron valide.
Scheduler.txt
: la configuration complète de cron sera redirigée vers un fichier.
Utilisation de variables d'environnement spécifiques au système / utilisateur dans cron
Mon travail cron réel attendait la plupart des arguments lorsque les variables d'environnement étaient passées à la commande docker run. Mais, avec bash, je n'ai pu utiliser aucune des variables d'environnement appartenant au système ou au conteneur Docker.
Ensuite, cela est venu comme une solution à ce problème:
- Ajoutez la ligne suivante dans le point d'entrée.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Mettez à jour la configuration cron et spécifiez-
SHELL=/bin/bash
BASH_ENV=/container.env
Enfin, vous entrypoint.sh
devriez ressembler à
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
# Setup a cron schedule
echo "SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Dernier point mais non le moindre: créer un Dockerfile
FROM ubuntu:16.04
MAINTAINER Himanshu Gupta
# Install cron
RUN apt-get update && apt-get install -y cron
# Add files
ADD run.sh /run.sh
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /run.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
C'est tout. Créez et exécutez l'image Docker!
RUN apt-get update && apt-get install cron