2017-11-02 6 views
0

Welche Best Practices zum Ausführen periodischer/geplanter Tasks (wie manage.py custom_command) beim Ausführen von Django mit Docker (docker-compose)?Django + docker + periodische Befehle

f.e. der häufigste Fall - ./manage.py clearsessions

  • Django es mit Cronjobs zu laufen empfiehlt ...
  • Aber Docker empfiehlt nicht mehr als einen laufenden Dienst zu einzelnen Container Hinzufügen ...

Ich denke, Ich kann einen Docker-Compose-Service aus dem gleichen Image für jeden Befehl erstellen, den ich ausführen muss - und der Befehl sollte Endlosschleife mit einem erforderlichen Schlaf ausführen, aber das scheint Overkill für jeden Befehl, der geplant werden muss

Wha Das ist dein Rat?

Antwort

0

Die Art und Weise, die

in meinem django Projekt für mich habe ich eine crontab-Datei wie diese haben :

0 0 * * * root python manage.py clearsessions  > /proc/1/fd/1 2>/proc/1/fd/2 

installiert/konfiguriert cron in meinem Dockerfile

RUN apt-get update && apt-get -y install cron 
ADD crontab /etc/cron.d/crontab 
RUN chmod 0644 /etc/cron.d/crontab 

und in Docker-compose.yml einen neuen Dienst hinzuzufügen, die gleiche Bild wie django Projekt bauen wird, aber cron -f als CMD

version: '3' 
services: 
    web: 
    build: ./myprojectname 
    ports: 
    - "8000:8000" 
    #... 


    cronjobs: 
    build: ./myprojectname 
    command: ["cron", "-f"] 
1

Erstellen Sie ein Docker-Bild mit Ihrer Django-Anwendung.

Sie können es benutzen, um Ihre Django app (die Web-Oberfläche), und zur gleichen Zeit ausgeführt werden, indem man in dem Befehl an die Docker ausführbar, wie dies mit dem Cron Periode Aufgaben planen:

docker exec --rm your_container python manage.py clearsessions 

Die --rm stellt sicher, dass Docker den Container entfernt, sobald er fertig ist; Andernfalls werden Sie schnell Container stoppen, die keinen Nutzen haben.

Sie können auch in jede zusätzliche Argumente übergeben, zum Beispiel -e mit der Umgebung zu ändern:

docker exec --rm -e DJANGO_DEBUG=True -e DJANGO_SETTINGS_MODULE=production \ 
python manage.py clearsessions 
+0

Ja laufen, das ist, was ich für gehen würde, wenn mein Projekt war einfach ein Docker-Bild .. aber in meinem Fall ist es ein Docker-komponieren mit mehreren Bildern (Django, Redis, Postgres, API) - und es wäre schön, wenn die geplanten Aufgaben auch in Docker-Compose anstelle von Host-Maschine definiert werden würde. –

+0

Es hat keinen Sinn, die Aufgaben in docker-compose zu definieren, da es die Aufgabe ist, die Container zu orchestrieren und zu starten (und zu stoppen). –

Verwandte Themen