Docker-Containerzeit und Zeitzone (spiegelt keine Änderungen wider)

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

Weiß jemand, was gibt?

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:

ENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Und als Bonus wird TZ auch im Container korrekt eingestellt.

Dies ist auch distributionsunabhängig, funktioniert also mit so ziemlich jedem Linux.

Hinweis: Wenn Sie ein Alpine-basiertes Image verwenden, müssen Sie das installieren tzdata erst. (siehe dieses Problem hier)

Sieht so aus:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

Normalerweise reicht es aus, eine Umgebungsvariable wie folgt im Docker-Container festzulegen:

docker run -e TZ=Europe/Amsterdam debian:jessie date

Das würde natürlich auch funktionieren mit docker-compose.

Sie können Ihre lokalen Dateien (/ etc/timezone und / etc/localtime ) als Volume in Ihrem Docker-Container hinzufügen.

Aktualisieren Sie Ihre docker-compose.yml mit den folgenden Zeilen.

volumes:    - "/etc/timezone:/etc/timezone:ro"    - "/etc/localtime:/etc/localtime:ro"

Jetzt ist die Containerzeit dieselbe wie auf Ihrem Host

Montage /etc/localtime im Bild, also ist es synchron mit host -v ist das beliebteste.

Aber sehen ausgabe 12084:

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:

App-Dockerdatei:

# Relocate the timezone fileRUN mkdir -p /config/etc && mv /etc/timezone /config/etc/ && ln -s /config/etc/timezone /etc/

App-Einstiegspunkt-Skript:

# 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.

In Ubuntu 16.04 Image gibt es einen Fehler. Lösung war

    ENV TZ 'Europe/Tallinn'    RUN echo $TZ > /etc/timezone && \    apt-get update && apt-get install -y tzdata && \    rm /etc/localtime && \    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \    dpkg-reconfigure -f noninteractive tzdata && \    apt-get clean

Fügen Sie hier meine zwei Cent hinzu, weil ich mehrere davon ausprobiert habe, aber keiner hat an Cloud-basierten Bildern funktioniert.

Dies hat jedoch den Trick gemacht:

ENV TZ=America/TorontoRUN apk updateRUN apk upgradeRUN apk add ca-certificates && update-ca-certificatesRUN apk add --update tzdataRUN rm -rf /var/cache/apk/*

[Quelle]

Im alpinen Basisbild (Beispiel Knoten verwenden: 10.16.0-alpine):

Dockerfile

FROM node:10.16.0-alpineENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /appCOPY package.json package-lock.json ./RUN npm i --productionCOPY . .CMD node index.js

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!

wenn Sie ein Docker-Image verwenden, das auf basiert ubuntu :

# Change the docker default timezone from UTC to SGTecho "Asia/Singapore" > /etc/timezonedpkg-reconfigure tzdatadate

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?

Wenn Sie ‘Alpineverwenden, müssen Sie zuersttzdata’ installieren, siehe hier How can I set the timezone please? · Issue #136 · gliderlabs/docker-alpine · GitHub

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.