Umgang mit Zeitzonen in Docker-Containern

0
713

Zeitzonen sind eine häufige Ursache für Verwirrung beim Containerisieren einer Anwendung. Werden Ihre Cron-Aufgaben zur richtigen Zeit ausgeführt? Docker-Container erben nicht die Zeitzone des Hosts, daher können unerwartete Planungsprobleme auftreten, die Ihre Anwendung verwüsten.

Hier wird der date-Befehl nativ auf einem ausgeführt Ubuntu 20.04-Host in der britischen Sommerzeit-Zeitzone:

Und hier ist derselbe Befehl in einem Container basierend auf einem unmodifizierten ubuntu:20.04-Image:

Der Container verwendet die UTC-Zeitzone, wodurch ein Unterschied von einer Stunde zwischen den beiden Zeiten entsteht.

How Do Funktionieren Linux-Zeitzonen?

Die meisten Linux-Distributionen verwenden das tzdata-Paket, um Zeitzoneninformationen bereitzustellen. Wenn tzdata installiert ist, können Sie die aktuelle Zeitzone überprüfen, indem Sie die Datei /etc/timezone lesen:

Werbung

Sie haben auch eine /etc/localtime-Datei. Dies ist ein Symlink zur richtigen Zeitzonendatenbank für den ausgewählten Standort:

Wenn Sie die Zeitzone mit dpkg-reconfigure tzdata ändern, wird der Symlink /etc/localtime so aktualisiert, dass er auf die neue Datenbank zeigt. Die Ausgabe von Befehlen wie Datum wird angepasst, um den Offset der aktiven Zeitzone einzubeziehen.

Das Problem mit Containern

Die Die Herausforderung bei Containern ergibt sich in erster Linie aus der Festlegung der Zeitzone. Wenn Sie an die Einrichtung Ihres Hosts zurückdenken, hätten Sie die Zeitzone im Rahmen der Betriebssysteminstallation festlegen müssen. Wenn Sie einen neuen Container ausführen, wird dieser jedoch sofort gestartet, ohne dass “Installation” Bühne. Es besteht keine Möglichkeit, eine geeignete Zeitzone auszuwählen.

Theoretisch könnten Container-Laufzeiten eine automatische Vererbung der Zeitzone des Hosts bieten. Dies geschieht nicht, da dies bei der Bereitstellung in Remoteumgebungen zu unerwarteten Ergebnissen führen kann. Es wäre leicht zu übersehen, dass Ihr Cron-Zeitplan auf Ihrem lokalen Computer funktioniert, aber in einem verwalteten Kubernetes-Cluster mit UTC-Zeit unerwartet ausgeführt wird.

Container-Images werden stattdessen mit einer integrierten Zeitzone ausgeliefert. Für die gängigsten Bilder ist dies UTC. Viele Basis-Images, insbesondere minimale, enthalten nicht einmal das tzdata-Paket. Sie haben keine /etc/timezone- oder /etc/localtime-Dateien.

Hinzufügen von Zeitzonen zu Ihren Containern

Der erste Teil der Einstellung der richtigen Zeitzone besteht darin, sicherzustellen, dass tzdata installiert ist. Wenn Ihr Image es nicht enthält, müssen Sie das Paket manuell als Teil Ihres Dockerfiles hinzufügen.

FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata-Werbung

Wenn tzdata installiert wird, erhalten Sie normalerweise eine interaktive Eingabeaufforderung, mit der Sie die richtige Zeitzone aus einem Menü auswählen können. Dies ist nicht hilfreich, wenn Sie Docker-Container programmgesteuert erstellen. Das Setzen der Umgebungsvariablen DEBIAN_FRONTEND unterdrückt die Eingabeaufforderung und stellt die Zeitzone standardmäßig auf UTC.

Sobald Sie tzdata in Ihr Bild aufgenommen haben, können Sie die richtige Zeitzone für Ihre Anwendung konfigurieren. Der einfachste Ansatz besteht darin, die TZ-Umgebungsvariable auf die Zeitzone zu setzen, die Sie verwenden möchten:

FROM ubuntu:latest ENV TZ=Europe/London ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata

Wenn Sie möchten, können Sie die TZ-Variable beim Starten von Containern setzen. Übergeben Sie es als Umgebungsvariable an docker run. Auf diese Weise können Sie die Standardzeitzone eines Bildes überschreiben, sofern es das tzdata-Paket enthält.

docker run -e TZ=Europe/London -it ubuntu:latest

Eine Alternative zu Umgebungsvariablen ist die Datei /etc/timezone. Sie können die erforderliche Zeitzone als Teil Ihres Dockerfiles schreiben. Wenn Sie diese Methode verwenden, müssen Sie tzdata mit Ihrem Paketmanager neu konfigurieren. Denken Sie daran, den nicht interaktiven Modus zu verwenden, oder Sie erhalten erneut die grafische Zeitzonen-Eingabeaufforderung.

VON ubuntu:latest RUN echo “Europe/London” > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata

Andere Techniken

Wenn Sie die Zeitzonensynchronisation mit dem Host garantieren möchten, können Sie Ihre lokalen tzdata-Dateien in Ihre Container einhängen. Damit dies korrekt funktioniert, benötigen Sie weiterhin tzdata im Container.

docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it ubuntu:latest

Obwohl Docker keine integrierte Unterstützung für Zeitzonen bietet, gilt dies nicht für alle Container-Engines. Podman hat ein dediziertes –tz-Flag, mit dem Sie die Zeitzone beim Erstellen eines neuen Containers festlegen können:

podman run –tz=Europe/London -it ubuntu:latest Advertisement

Hinter den Kulissen mountet Podman eine entsprechende /etc/localtime-Datei für Sie. Die angegebene Zeitzone bleibt für die Lebensdauer des Containers bestehen.

Podman lässt Sie auch eine Standardzeitzone für Container festlegen, die ohne das Flag –tz erstellt wurden. Erstellen oder bearbeiten Sie .config/containers/containers.conf in Ihrem Home-Verzeichnis. Fügen Sie eine tz-Einstellung in einer neuen Zeile in der Datei hinzu:

# Wird verwendet, wenn kein –tz-Flag angegeben ist tz = “Europe/London”

Die native Zeitzonenintegration von Podman erleichtert die Arbeit mit Docker. Da die CLI von Podman mit Docker kompatibel ist, kann der Wechsel eine Überlegung wert sein, wenn Sie häufig mit Containern in verschiedenen Zeitzonen arbeiten.

Zusammenfassung

Zeitzonen werden beim Einrichten von Docker-Containern oft übersehen. Die meisten Basis-Images verwenden standardmäßig die UTC-Zeit, was zu Verwirrung führen kann, wenn die Zeitzone des Hosts unterschiedlich ist.

Durch die Installation des tzdata-Pakets wird Ihr Container über die TZ-Umgebungsvariable mit allen Zeitzonen kompatibel. etc/timezone und /etc/localtime. Alternativ können Sie die Zeitzone Ihres Hosts synchronisieren, indem Sie die entsprechenden Dateien in Ihre Container einbinden.

Denken Sie abschließend daran, dass diese Überlegungen auch für gehostete Docker-Dienste und Kubernetes-Cluster gelten. Ihre Container verwenden die UTC-Zeit, sofern nicht anders angegeben. Solange Sie Umgebungsvariablen festlegen können, können Sie mit TZ die Zeitzone für Ihre Workloads anpassen.