Frage Zeit und Zeitzone des Dockercontainers (Änderungen werden nicht berücksichtigt)


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 UTC-Zeit.

Für eine Weile habe ich das in meiner Dockerfile gemacht:

RUN sudo echo "America/Los_Angeles" > /etc/timezone

Aus irgendeinem Grund hörte das auf zu arbeiten. Auf der Suche online sah ich das folgende vorgeschlagen:

docker run -v /etc/timezone:/etc/timezone [image-name]

Beide diese Methoden stellen die Zeitzone korrekt ein!

$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015

Wer weiß was gibt?


73
2018-04-14 23:49


Ursprung


Wenn du benutzt Alpine, müssen Sie installieren tzdata zuerst, siehe hier github.com/gliderlabs/docker-alpine/issues/136 - Belter


Antworten:


Das Geheimnis ist hier dpkg-reconfigure tzdata einfach erstellt /etc/localtime als Kopie, Hardlink oder Symlink (ein Symlink ist bevorzugt) zu einer Datei in /usr/share/zoneinfo. Es ist also möglich, dies vollständig aus Dockerfile zu machen. Erwägen:

ENV TZ=America/Los_Angeles
RUN 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 verteilungsunabhängig und funktioniert mit so ziemlich jedem Linux.

Hinweis: Wenn Sie ein alpines Bild verwenden, müssen Sie das installieren tzdata zuerst. (Siehe dieses Problem Hier)

Sieht aus wie das:

RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles

124
2018-04-17 19:55



Liste der TZ-Namen: en.wikipedia.org/wiki/List_of_tz_database_time_zones - BillyTom
Mit Ubuntu: 16.04 (und vielleicht andere Version) müssen Sie haben tzdata Paket installiert für diese Arbeit. - Opsse


In der Regel ist es ausreichend, eine Umgebungsvariable im Andock-Container zu setzen:

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

Natürlich würde das auch mit funktionieren docker-compose.


30
2018-01-13 22:15



Dies scheint der eleganteste Weg zu sein. Achten Sie darauf, dass einige Basisbilder, wie ubuntu:16.04, hat nicht die tzdata Paket, das in Dockerfile hinzugefügt werden soll. - Julien Fastré
+1 - Ich stimme Julien zu; Dies scheint der eleganteste Weg zu sein, um Zeitzonen zur Laufzeit einzustellen. Dies funktioniert gut mit CentOS. Alpine Image erfordert die Installation des Pakets 'tzdata', das gegenüber den Harcoding-Konfigurationen zur Build-Zeit vorzuziehen ist, es sei denn, die zusätzliche 3MB-Bildnutzlast kann nicht toleriert werden :) - Frelling


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

Aber sieh Problem 12084:

Es ist nicht korrekt, weil es nicht funktioniert, wenn die Software stattdessen die Datei benötigt /etc/timezone eingestellt werden.
  Auf diese Weise verlässt du es als Standardwert etc/UTC.

Ich habe festgestellt, dass es eigentlich keine narrensichere elegante Möglichkeit gibt, die Zeitzone innerhalb eines Andock-Containers einzustellen.
  Also habe ich mich endlich für diese Lösung entschieden:

App-Dockerdatei:

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

App-Einstiegsskript:

# Set timezone as specified in /config/etc/timezone
dpkg-reconfigure -f noninteractive tzdata

Datenvolumen /config dockerfile, lokalisiert in einem bestimmten Land oder einer bestimmten Region:

# Set the time zone
RUN echo "Europe/London" > /config/etc/timezone

... Es ist nicht elegant, weil 3 separate Dateien und neu erstellen /etc/localtime auf jedem Laufzeitcontainer starten. Was ziemlich verschwenderisch ist.

Es funktioniert jedoch ordnungsgemäß und erzielt eine Trennung zwischen dem Bild der Basis-App und jeder lokalisierten Konfiguration pro Land.
  In 3 Zeilen Code.


16
2018-04-15 06:14



Für mich war es: RUN echo "Europe/London" > /etc/timezone - jpmottin
@jpmottin Also ein bisschen wie in serverfault.com/a/856593/783 dann? - VonC


Sie können Ihre lokalen Dateien (/ etc / timezone und / etc / localtime) als Datenträger 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 die gleiche wie auf Ihrem Host


10
2018-06-08 15:55



Geben Sie den Befehl auf dem CentOS-Verteilungs-Host ein echo "Europe/Paris" > /etc/timezone vor dem Neustart des Containers. - CrazyMax
Funktioniert das auf MacOS Host? - Redsandro
Funktioniert nicht in MAC - Marcello de Sales
Das hat früher mit MacOS funktioniert, aber ich habe es gerade nach langer Zeit wieder ausprobiert und bekomme folgendes. Nicht sicher, ob High Sierra oder ein Dockerwechsel dies verursacht hat: "docker: Fehler Antwort vom Daemon: Mounts verweigert: Der Pfad / etc / localtime wird nicht von OS X freigegeben und ist Docker nicht bekannt. Sie können gemeinsame Pfade von Docker konfigurieren - > Einstellungen ... -> Dateifreigabe docs.docker.com/docker-for-mac/osxfs/#namespaces Für mehr Information." - gae123
Dies wird Ihre Zoneinfo-Datenbank beschädigen, da / etc / localtime ein Symlink ist (daher wird / usr / share / zoneinfo / Some / Thing wahrscheinlich als / usr / share / zoneinfo / UTC im Container gemountet). Ganz zu schweigen davon, dass Sie die db-Datei vom Host mit der im Container mischen würden. - ionelmc


In Ubuntu 16.04 Bild 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

8
2018-06-19 10:12



Ernsthaft ... das ist die einzige Lösung, die funktioniert hat! - Gerrat
Musste auch tun - scheint, dass tzdata nicht mehr in einigen Distributionen standardmäßig ist. - Peter


wenn Sie ein Docker-Image basierend auf verwenden ubuntu :

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date

3
2017-07-16 03:37





Danke an VonC für die Information und den Link zum Thema. Das sieht nach so einer verwickelten Unordnung aus, also teste ich meine eigene Idee, wie ich das lösen kann 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 zu verdeutlichen:

FROM chocko/ubuntu:local

Da muss etwas nicht stimmen, denn es scheint zu leicht übersehen zu werden ... Oder ist das akzeptabel?


2
2018-04-15 19:10



Das habe ich auch versucht, aber die Zeitzone immer noch setzt sich nach I zurück exit der Kontainer. Dies ist auf Debian. - Mike Chamberlain
@MikeChamberlain hast du zufällig die angenommene Antwort von Michael Hampton oben versucht? Ich habe es selbst nicht implementiert, aber ich denke, es ist der Weg, um die Upvotes zu betrachten, die es erhalten hat. - Chockomonkey


Hier meine zwei Cents, weil ich mehrere davon probiert habe, aber keine auf alpinen Bildern.

Dies hat jedoch den Trick bewirkt:

ENV TZ=America/Toronto
RUN apk update
RUN apk upgrade
RUN apk add ca-certificates && update-ca-certificates
RUN apk add --update tzdata
RUN rm -rf /var/cache/apk/*

[Quelle]


1
2018-04-25 01:05





Eine allgemeinere Methode zum Einstellen der Zeitzone docker run Argumente:

-e TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

Oder zur Wiederverwendung:

function GET_TZ () {
    ls -la /etc/localtime | cut -d/ -f8-9
}

...
-e TZ=`GET_TZ`

0
2017-08-08 09:03