it-swarm.com.de

Docker Container Zeit & Zeitzone (spiegelt keine Änderungen wider)

Woher erhalten Docker-Container ihre Zeitinformationen? Ich habe einige Container aus dem Basis-Ubuntu: Trusty Image erstellt. Wenn ich es ausführe und 'Datum' anfordere, erhalte ich UTC-Zeit.

Für eine Weile habe ich dies 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 Folgendes vorgeschlagen:

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

Beide Methoden stellen die Zeitzone jedoch korrekt ein!

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

Weiß jemand was gibt?

159
Chockomonkey

Das Geheimnis hier ist, dass dpkg-reconfigure tzdata erstellt einfach /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 von Ihrer Docker-Datei aus zu tun. 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 richtig eingestellt.

Dies ist auch verteilungsunabhängig, so dass es mit so ziemlich jedem Linux funktioniert.

Hinweis: Wenn Sie ein alpines Image verwenden, müssen Sie zuerst das tzdata installieren. (siehe diese Ausgabe hier )

Sieht aus wie das:

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

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

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

Dies würde natürlich auch mit docker-compose Funktionieren.

68
Victor Klos

Sie können Ihre lokalen Dateien (/ etc/timezone und/etc/localtime) als Volume in Ihren Docker-Container einfü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

23
thhan

Das Einfügen von /etc/localtime In das Bild, damit es mit Host -v Synchronisiert wird, ist am beliebtesten.

Aber siehe Ausgabe 12084 :

es ist nicht korrekt, da es nicht funktioniert, wenn die Software stattdessen das Setzen der Datei /etc/timezone erfordert.
Auf diese Weise belassen Sie es als Standardwert etc/UTC.

Ich habe festgestellt, dass es tatsächlich keine narrensichere, elegante Möglichkeit gibt, die Zeitzone in einem Docker-Container festzulegen.
Also haben wir uns endlich für diese Lösung entschieden:

App Docker-Datei:

# Relocate the timezone file
RUN 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/timezone
dpkg-reconfigure -f noninteractive tzdata

Datenvolumen /config Docker-Datei, 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 es 3 separate Dateien umfasst und bei jedem Start des Laufzeitcontainers /etc/localtime neu erstellt. Welches ist ziemlich verschwenderisch.

Es funktioniert jedoch ordnungsgemäß und erreicht erfolgreich eine Trennung zwischen dem Basis-App-Image und jeder lokalisierten Konfiguration pro Land.
In 3 Codezeilen.

22
VonC

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
12
qwerty

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

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

Ich füge hier meine zwei Cent hinzu, weil ich mehrere davon ausprobiert habe, aber keiner an alpinen Bildern gearbeitet hat.

Dies hat jedoch den Trick getan:

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 ]

4
Alpha

Vielen Dank an VonC für die Informationen und den Link zum Problem. Dies scheint ein so kompliziertes Durcheinander zu sein, dass ich einige Tests meiner eigenen Idee durchgeführt habe, wie dies gelöst werden kann, und es scheint großartig zu funktionieren.

>docker run -it ubuntu:trusty /bin/bash
#dpkg-reconfigure tzdata

(Befolgen Sie die Anweisungen, um meine Zeitzone auszuwählen.)

>docker commit [container-id] chocko/ubuntu:local

Dann habe ich meine Docker-Dateien aktualisiert, um dies widerzuspiegeln:

FROM chocko/ubuntu:local

Daran muss etwas falsch sein, denn es scheint zu leicht, übersehen zu werden ... Oder ist das akzeptabel?

3
Chockomonkey

Eine allgemeinere Methode zum Festlegen der Zeitzone in 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`
1
Mugen