Woher bekommen Docker-Container ihre Zeitinformationen? Ich habe einige Container aus dem grundlegenden Ubuntu: trusty-Image erstellt, und wenn ich es ausführe und 'date' anfordere, erhalte ich die UTC-Zeit.
Für eine Weile habe ich das umgangen, indem ich in meiner Docker-Datei Folgendes getan habe:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
Aus irgendeinem Grund funktionierte das jedoch nicht mehr. Bei der Online-Suche habe ich das unten Vorgeschlagene gesehen:
docker run -v /etc/timezone:/etc/timezone [image-name]
Beide Methoden stellen die Zeitzone jedoch korrekt ein!
$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015
Das Geheimnis hier ist das dpkg-reconfigure tzdata einfach schafft /etc/localtime als Kopie, Hardlink oder Symlink (ein Symlink wird bevorzugt) zu einer Datei in /usr/share/zoneinfo. Es ist also möglich, dies vollständig aus Ihrer Docker-Datei heraus zu tun. Betrachten:
es ist nicht korrekt, weil es nicht funktioniert, wenn die Software stattdessen die Datei benötigt /etc/timezone eingestellt werden. Auf diese Weise verwenden Sie es als Standardwert etc/UTC.
Ich habe festgestellt, dass es tatsächlich keine narrensichere elegante Möglichkeit gibt, die Zeitzone innerhalb eines Docker-Containers festzulegen. Also habe ich mich endlich für diese Lösung entschieden:
# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata
Datenvolumen /config dockerfile, lokalisiert für ein bestimmtes Land oder eine bestimmte Region:
# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone
... es ist nicht elegant, da 3 separate Dateien beteiligt sind und neu erstellt werden /etc/localtime bei jedem Laufzeitcontainerstart. Was ziemlich verschwenderisch ist.
Es funktioniert jedoch ordnungsgemäß und erreicht erfolgreich eine Trennung zwischen dem Basis-App-Image und jeder lokalisierten Konfiguration pro Land. In 3 Zeilen Code.
Verwendung eines Fedora-Containers (funktioniert wahrscheinlich auch mit Ubuntu):
Die einfachste Lösung, die ich gefunden habe, war, Folgendes in docker-Compose zu verwenden.yml
environment: TZ: "${TZ:-America/Los_Angeles}"
Dann in deinem .env-Datei (die docker-Compose automatisch liest)
TZ=America/Los_Angeles
Auf diese Weise können Sie Docker-Compose setzen.yml unter Versionskontrolle und verwenden Sie eine angepasste .env-Datei, die von git ignoriert werden kann.
Sie erhalten einen Standardwert für den Container und Sie erhalten Anpassungen, das Beste aus beiden Welten.
Für Fedora waren keine weiteren Änderungen notwendig, es funktioniert einfach!
Danke an VonC für die Informationen und den Link zum Problem. Das scheint so ein gewundenes Durcheinander zu sein, also habe ich meine eigene Idee, wie ich das lösen kann, getestet und es scheint großartig zu funktionieren.
>docker run -it ubuntu:trusty /bin/bash#dpkg-reconfigure tzdata
(folgen Sie den Anweisungen, um meine Zeitzone auszuwählen)
>docker commit [container-id] chocko/ubuntu:local
Dann habe ich meine Dockerfiles aktualisiert, um dies widerzuspiegeln:
FROM chocko/ubuntu:local
Daran muss etwas falsch sein, weil es zu leicht zu übersehen scheint... Oder ist das akzeptabel?
ZUR INFO . . . Ich möchte die Zeitzone des Containers zur Docker-Laufzeit festlegen, nicht zur Docker-Build- / Dockerfile-Zeit. Die Verwendung von -v / etc / localtime: / etc / localtime: ro (CentOS) funktioniert irgendwie. Innerhalb des Containers gibt das Befehlszeilendatum das Datum im erwarteten Zeitzonenformat zurück. ABER Jenkins, der im Container läuft, denkt, dass die Zeitzone UTC ist. Warum? /etc/localtime ist ein Symlink zu …/usr / share/ zoneinfo / UTC im eingebauten Container. Der Inhalt der UTC-Datei im Container ist jetzt die neue Zeitzone. Aber Jenkins (und vielleicht andere Java-basierte Software) verwenden den Namen des Symlinks, der immer noch “UTC” ist. Suche nach einer Lösung . . .
Brauche 2 Dinge, 1. wenn der Container erstellt wird, verwenden Sie ein Init-Skript, um den Symlink /etc/localtime und /etc/timezone und 2 festzulegen. für Jenkins wird die Zeitzone aus zwei Java-Optionen entnommen, diese Optionen müssen an das Init-Skript übergeben werden, das den Jenkins-Prozess startet. z.B. " -Dorg.Apache.Commons.gelee.Tags.fmt.Zeitzone = Amerika / New_York -Benutzer.zeitzone = Amerika / New_York ". Entschuldigung, dies ist Jenkins-spezifisch, aber hoffentlich nützlich für einige andere Jenkins-Benutzer.