Skonfiguruj crona równolegle do jednorazowego zadania
Utwórz plik skryptu, powiedzmy run.sh, z zadaniem, które ma być uruchamiane okresowo.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Zapisz i wyjdź.
Użyj Entrypoint zamiast CMD
Jeśli masz wiele zadań do uruchomienia podczas konteneryzacji dokera, użyj pliku punktu wejścia, aby je wszystkie uruchomić.
Plik punktu wejścia to plik skryptu, który zaczyna działać po wydaniu polecenia uruchamiania dokera. Tak więc wszystkie kroki, które chcemy uruchomić, można umieścić w tym pliku skryptu.
Na przykład mamy 2 zadania do uruchomienia:
Uruchom raz zadanie : echo „Kontener Docker został uruchomiony”
Uruchom okresową pracę : run.sh
Utwórz 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
Rozumiemy crontab, który został ustawiony w pliku
* * * * *
: Harmonogram Cron; zadanie musi działać co minutę. Możesz zaktualizować harmonogram zgodnie ze swoimi wymaganiami.
/run.sh
: Ścieżka do pliku skryptu, który ma być uruchamiany okresowo
/var/log/cron.log
: Nazwa pliku do zapisania wyniku zaplanowanego zadania cron.
2>&1
: Dzienniki błędów (jeśli istnieją) również zostaną przekierowane do tego samego pliku wyjściowego, który został użyty powyżej.
Uwaga : Nie zapomnij dodać nowej nowej linii, ponieważ czyni ją to prawidłowym cronem.
Scheduler.txt
: pełna konfiguracja crona zostanie przekierowana do pliku.
Używanie zmiennych środowiskowych specyficznych dla systemu / użytkownika w cron
Moje rzeczywiste zadanie cron oczekiwało większości argumentów, gdy zmienne środowiskowe były przekazywane do komendy uruchamiania dokera. Ale dzięki bash nie byłem w stanie użyć żadnej ze zmiennych środowiskowych należących do systemu lub kontenera dokowanego.
Później pojawiło się to obejście tego problemu:
- Dodaj następujący wiersz w pliku entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Zaktualizuj konfigurację crona i określ-
SHELL=/bin/bash
BASH_ENV=/container.env
W końcu entrypoint.sh
powinieneś wyglądać
#!/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: utwórz plik Docker
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
Otóż to. Zbuduj i uruchom obraz Docker!
RUN apt-get update && apt-get install cron