Richten Sie einen Cron parallel zu einem einmaligen Job ein
Erstellen Sie eine Skriptdatei, z. B. run.sh, mit dem Job, der regelmäßig ausgeführt werden soll.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Speichern und schließen.
Verwenden Sie Entrypoint anstelle von CMD
Wenn Sie während der Docker-Containerisierung mehrere Jobs starten müssen, verwenden Sie die Entrypoint-Datei, um alle Jobs auszuführen.
Die Einstiegspunktdatei ist eine Skriptdatei, die ausgeführt wird, wenn ein Docker-Ausführungsbefehl ausgegeben wird. Alle Schritte, die wir ausführen möchten, können in diese Skriptdatei eingefügt werden.
Zum Beispiel müssen wir 2 Jobs ausführen:
Einmal Job ausführen: Echo "Docker-Container wurde gestartet"
Führen Sie einen regelmäßigen Job aus : run.sh.
Erstellen Sie 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
Lassen Sie uns die Crontab verstehen, die in der Datei eingerichtet wurde
* * * * *
: Cron Zeitplan; Der Job muss jede Minute ausgeführt werden. Sie können den Zeitplan entsprechend Ihren Anforderungen aktualisieren.
/run.sh
: Der Pfad zur Skriptdatei, die regelmäßig ausgeführt werden soll
/var/log/cron.log
: Der Dateiname zum Speichern der Ausgabe des geplanten Cron-Jobs.
2>&1
: Die Fehlerprotokolle (falls vorhanden) werden ebenfalls in dieselbe Ausgabedatei umgeleitet, die oben verwendet wurde.
Hinweis : Vergessen Sie nicht, eine zusätzliche neue Zeile hinzuzufügen, da dies eine gültige Cron macht.
Scheduler.txt
: Das komplette Cron-Setup wird in eine Datei umgeleitet.
Verwenden system- / benutzerspezifischer Umgebungsvariablen in cron
Mein eigentlicher Cron-Job erwartete die meisten Argumente, da die Umgebungsvariablen an den Docker-Befehl run übergeben wurden. Mit bash konnte ich jedoch keine der Umgebungsvariablen verwenden, die zum System oder zum Docker-Container gehören.
Dann kam dies als Umgehung für dieses Problem:
- Fügen Sie die folgende Zeile in die Datei entrypoint.sh ein
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Aktualisieren Sie das Cron-Setup und geben Sie Folgendes an:
SHELL=/bin/bash
BASH_ENV=/container.env
Endlich entrypoint.sh
solltest du so aussehen
#!/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
Last but not least: Erstellen Sie eine Docker-Datei
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
Das ist es. Erstellen Sie das Docker-Image und führen Sie es aus!
RUN apt-get update && apt-get install cron