Zeitzonenprobleme mit im Docker-Container bereitgestelltem Django

Zeitzonenprobleme mit im Docker-Container bereitgestelltem Django

Mittlerweile ist die Containerbereitstellung sehr ausgereift. Viele unserer Dienste nutzen die Containerbereitstellung, und Aktualisierung und Wiederherstellung sind sehr bequem. Es gibt jedoch ein problematischeres Problem, nämlich die Zeitzonenverarbeitung. Normalerweise wird es durch Einfügen von TZ-Umgebungsvariablen gelöst, aber diese Verarbeitungsmethode funktioniert in Django nicht.

Zeitzonenkonfiguration in Django

In der Konfigurationsdatei settings.py von Django gibt es zwei Konfigurationsparameter bezüglich Zeit und Zeitzone, nämlich TIME_ZONE und USE_TZ. Wir gehen davon aus, dass Django nach der Konfiguration in settings.py die Ortszeit korrekt abrufen kann, aber tatsächlich widerspricht dies unseren Erwartungen. Sehen wir uns an, was diese beiden Einstellungen bewirken.

USE_TZ=True

Wenn USE_TZ auf True gesetzt ist, verwendet Django die Standardzeitzone des Systems. Zu diesem Zeitpunkt ist die Einstellung TIME_ZONE grundsätzlich ungültig, d. h. sie hat keine Auswirkung, unabhängig davon, ob sie festgelegt ist oder nicht.

USE_TZ=Falsch

Wenn USE_TZ auf False gesetzt ist

  1. TIME_ZONE ist auf Keine eingestellt
  2. Django verwendet weiterhin die Standardzeitzone
  3. Wenn TIME_ZONE auf eine andere Zeitzone eingestellt ist

Wenn Sie Windows verwenden, ist die Einstellung TIME_ZONE nutzlos und Django verwendet die lokale Zeit. Wenn Sie andere Systeme verwenden, wird die UTC-Zeit in dieser Zeitzone verwendet.

Wenn Sie beispielsweise USE_TZ = False, TIME_ZONE = „Asia/Shanghai“ festlegen, wird die UTC-Zeit von Shanghai verwendet.

An diesem Punkt denken Sie vielleicht, dass die Zeit stimmt, aber das ist nicht der Fall. Wir müssen auch auf die Zeitzoneneinstellungen des Systems achten.

Festlegen der Zeitzone in Linux-Containern

Meine Ortszeit ist jetzt: 16:15, und die Einstellungen in Django sind: USE_TZ = False, TIME_ZONE = 'Asia/Shanghai'

Fügen Sie nicht die Umgebungsvariable TZ=Asia/Shanghai ein, um den Container aufzurufen und die Containerzeit und -zeitzone anzuzeigen.

Die Systemzeit wird in der Zeitzone UTC angezeigt, die Uhrzeit ist: 08:15, genau 8 Stunden Unterschied

Rufen Sie die Django-Umgebung auf, um die Uhrzeit und Zeitzone anzuzeigen

Python manage.py-Shell 
 
von Datum/Uhrzeit, importiere Datum/Uhrzeit 
datetime.now() 
# Ausgabe datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
 
von django.utils importiere Zeitzone 
Zeitzone.get_current_timezone_name() 
# Ausgabe 'Asien/Shanghai'

Umgebungsvariable TZ=Asia/Shanghai einfügen
Betreten Sie den Container, um die Uhrzeit und Zeitzone anzuzeigen

Die Systemzeit wird in der asiatischen Zeitzone angezeigt, die Zeit entspricht jedoch weiterhin der UTC-Zeit und nicht der tatsächlichen Ortszeit.

Rufen Sie die Django-Umgebung auf, um die Uhrzeit und Zeitzone anzuzeigen

Python manage.py-Shell 
 
von Datum/Uhrzeit, importiere Datum/Uhrzeit 
datetime.now() 
# Ausgabe datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
 
von django.utils importiere Zeitzone 
Zeitzone.get_current_timezone_name() 
# Ausgabe 'Asien/Shanghai' 

Wie Sie sehen, ist die Zeit, obwohl sich die Zeitzone geändert hat, immer noch UTC-Zeit, sowohl im Container selbst als auch in Django

Durch eine Onlinesuche wissen wir, dass wir zum Ändern der Zeitzone des Linux-Systems die Datei /etc/localtime ändern müssen.

Ändern der Zeitzone des Linux-Containers

Normalerweise wird die Datei /etc/localtime des Hosts in die Datei /etc/localtime des Containers kopiert. Wir haben jedoch durch Abfragen festgestellt, dass die Datei /etc/localtime eigentlich nur ein Softlink ist. Die eigentliche Datei lautet: /usr/share/zoneinfo/Asia/Shanghai

Docker cp /usr/share/zoneinfo/Asia/Shanghai Test:/etc/localtime
Ohne die Umgebungsvariable TZ=Asia/Shanghai in den Container einzufügen, melden wir uns beim Container an und stellen fest, dass die Systemzeit des Containers die lokale Zeit und Zeitzone korrekt abgerufen hat.

Wenn die Umgebungsvariable TZ=Asia/Shanghai eingefügt wird, wird, selbst wenn die Datei /etc/localtime ersetzt wird, nur die Zeitzone geändert und die Zeit ist immer noch die UTC-Zeit

Rufen Sie die Django-Umgebung auf, um die Uhrzeit anzuzeigen

Python manage.py-Shell 
 
von Datum/Uhrzeit, importiere Datum/Uhrzeit 
datetime.now() 
# Ausgabe datetime.datetime(2021, 10, 8, 8, 43, 43, 754698) 

Die Linux-Systemzeit ist normal, aber die Zeit in der Django-Umgebung ist immer noch falsch und entspricht immer noch der UTC-Zeit. Zu diesem Zeitpunkt sind viele Leute ein wenig verrückt und denken möglicherweise, dass es ein Problem mit den USE_TZ- und TIME_ZONE-Einstellungen in settings.py gibt. Tatsächlich liegt das Problem hier nicht. Der Grund dafür ist, dass die Datetime-Bibliothek nach der Datei „Asia/Shanghai“ im Verzeichnis /usr/share/zoneinfo/ sucht, unser Image dieses Verzeichnis jedoch nicht enthält, sodass Django weiterhin die Zeitzone UTC verwendet. Die Lösung ist ganz einfach: Erstellen Sie ein Verzeichnis /usr/share/zoneinfo/Asia und kopieren Sie die Dateien in dieses Verzeichnis.

# Im Container (falls dieses Verzeichnis nicht existiert) 
mkdir -p /usr/share/zoneinfo/Asia 
 
# Außerhalb des Containers Docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai

Melden Sie sich dann beim Container an und rufen Sie die Django-Umgebung auf, um die Uhrzeit zu überprüfen

Python manage.py-Shell 
 
von Datum/Uhrzeit, importiere Datum/Uhrzeit 
datetime.now() 
# Ausgabe datetime.datetime(2021, 10, 8, 16, 49, 32, 57) 

Diesmal war der Zeitpunkt genau richtig.

Zusammenfassen

Für das Problem der Container-Zeitzone wird empfohlen, /etc/localtime während der Containererstellungsphase zu installieren und festzulegen. Fügen Sie beispielsweise die folgende Anweisung in die Docker-Datei ein

HINZUFÜGEN /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai 
 
RUN ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

Auf diese Weise müssen wir beim Starten unseres Containers nicht auf das Zeitzonenproblem achten. Wenn der Container erstellt wurde, mounten Sie die Zeitzonendatei beim Starten

docker run -d -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai Bildname 

Diese Methode ist problematischer. Eine andere Situation ist die, mit der wir jetzt konfrontiert sind. Der Dienst ist bereits online und wir stellen fest, dass ein Zeitproblem vorliegt. Wir kopieren die beiden Dateien manuell in den Container und starten den Container dann neu.

Docker cp /usr/share/zoneinfo/Asia/Shanghai Test:/etc/localtime 
Docker cp /usr/share/zoneinfo/Asia/Shanghai Test:/usr/share/zoneinfo/Asia/Shanghai 
Docker-Neustarttest 

Dies ist das Ende dieses Artikels über das Zeitzonenproblem bei der Bereitstellung von Django in einem Docker-Container. Weitere Informationen zur Docker-Bereitstellung der Django-Zeitzone finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Beispiel für die Bereitstellung einer Django-Anwendung mit Docker
  • So verwenden Sie Docker zum Bereitstellen eines Django-Technologie-Stack-Projekts
  • Beispiel für die Bereitstellung eines Django-Projekts mit Docker
  • Bereitstellung von Django-Docker-Containern Lokale Bereitstellung von Django-Docker
  • So dockerisieren Sie eine Python-Django-Anwendung
  • So verwenden Sie Docker-Compose, um Django-Anwendungen offline bereitzustellen
  • Detaillierte Erläuterung zur Verwendung von Docker zum Bereitstellen der Django + MySQL8-Entwicklungsumgebung

<<:  Zusammenfassung der Tipps zur CSS-Verwendung

>>:  CSS sorgt dafür, dass der Footer automatisch unten bleibt, wenn die Inhaltshöhe nicht ausreicht

Artikel empfehlen

Befehlscodebeispiele für die Installation und Konfiguration von Docker

Docker-Installation Installieren von Abhängigkeit...

Lernprogramm für HTML-Webseitenlisten-Tags

Lernprogramm zum Erlernen von Listen-Tags für HTML...

Skin-Change-Lösung basierend auf Vue kombiniert mit ElementUI

Inhaltsverzeichnis Vorne geschrieben Lösung 1: Gl...

Einfache Implementierung zum Ausblenden der Bildlaufleiste in HTML

1. HTML-Tags mit Attributen XML/HTML-CodeInhalt i...

JavaScript-Code zur Implementierung eines einfachen Rechners

In diesem Artikelbeispiel wird der spezifische Ja...

Ein kurzer Vortrag über Rx-responsive Programmierung

Inhaltsverzeichnis 1. Beobachtbar 2. Funktionen h...

Überwachen Sie die Größenänderung eines DOM-Elements über Iframe

Ein während des Entwicklungsprozesses häufig auft...

Einführung in die Vue3 Composition API

Inhaltsverzeichnis Überblick Beispiel Warum wird ...

Implementierung der gemeinsamen Nutzung von Daten zwischen Docker Volume-Containern

Was ist Volumen? „Volume“ bedeutet auf Englisch K...

Was tun, wenn Sie das ursprüngliche Passwort für MySQL auf dem MAC vergessen?

Die Methode zur Lösung des Problems, das anfängli...