Vraag Docker Container tijd & tijdzone (geeft geen wijzigingen weer)


Waar krijgen Docker-containers hun tijdinformatie? Ik heb een aantal containers gemaakt van de basis ubuntu: vertrouwde afbeelding, en als ik het uitvoer en om 'datum' vraag, krijg ik UTC-tijd.

Voor een tijdje kreeg ik dit door het volgende in mijn Dockerfile te doen:

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

Maar om de een of andere reden stopte het werken. Ik heb online gezocht en ik zag de onderstaande suggesties:

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

Beide methoden stellen echter de tijdzone correct in!

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

Iedereen weet wat geeft?


73
2018-04-14 23:49


oorsprong


Als je gebruikt Alpine, je moet installeren tzdata eerst, zie hier github.com/gliderlabs/docker-alpine/issues/136 - Belter


antwoorden:


Het geheim hier is dat dpkg-reconfigure tzdata maakt gewoon /etc/localtime als een kopie, een hardlink of een symlink (een symlink heeft de voorkeur) voor een bestand in /usr/share/zoneinfo. Het is dus mogelijk om dit volledig vanuit uw Dockerfile te doen. Overwegen:

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

En als bonus wordt TZ ook correct in de container geplaatst.

Dit is ook distributie-agnostisch, dus het werkt met vrijwel elke Linux.

Opmerking: als u een alpine-gebaseerde afbeelding gebruikt, moet u de tzdata eerste. (zie dit probleem hier)

Het lijkt op dit:

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

124
2018-04-17 19:55



Lijst met TZ-namen: en.wikipedia.org/wiki/List_of_tz_database_time_zones - BillyTom
Met Ubuntu: 16.04 (en misschien een andere versie) die je moet hebben tzdata pakket geïnstalleerd om dit te laten werken. - Opsse


Meestal volstaat het om een ​​omgevingsvariabele in de docker-container in te stellen, zoals:

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

Natuurlijk zou dit ook werken met docker-compose.


30
2018-01-13 22:15



Dit lijkt de meest elegante manier te zijn. Zorg ervoor dat een basis afbeelding, zoals ubuntu:16.04, heeft niet de tzdata pakket dat moet worden toegevoegd in Dockerfile. - Julien Fastré
+1 - Ik ben het eens met Julien; dit lijkt de meest elegante manier om tijdzones tijdens runtime in te stellen. Dit werkt goed met CentOS. Alpine image vereist wel de installatie van het 'tzdata'-pakket, dat de voorkeur heeft boven harcoding-configuraties tijdens de build-tijd, tenzij de extra 3MB-afbeelding payload niet kan worden getolereerd :) - Frelling


Montage /etc/localtime in de afbeelding, dus het is in sync met host -v is het meest populair.

Maar zie uitgave 12084:

het is niet correct omdat het niet werkt wanneer de software in plaats daarvan het bestand vereist /etc/timezone er klaar voor zijn.
  Op die manier gebruikt u het als de standaardwaarde etc/UTC.

Ik heb vastgesteld dat er eigenlijk geen feilloze, elegante manier is om de tijdzone in een dockercontainer in te stellen.
  Dus hebben we eindelijk afgerekend op deze oplossing:

App dockerbestand:

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

App entrypoint script:

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

Gegevensvolume /config dockerfile, gelokaliseerd in een specifiek land of regio:

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

... het is niet elegant omdat er 3 afzonderlijke bestanden bij betrokken zijn en opnieuw gemaakt moeten worden /etc/localtime start bij elke runtime-container. Dat is nogal verspilling.

Het werkt echter wel goed en kan met succes de scheiding tussen het app-beeld van de basis en de gelokaliseerde configuratie van elk land tot stand brengen.
  In 3 regels code.


16
2018-04-15 06:14



Voor mij was het: RUN echo "Europe/London" > /etc/timezone - jpmottin
@jpmottin Zo een beetje als in serverfault.com/a/856593/783 dan? - VonC


U kunt uw lokale bestanden (/ etc / timezone en / etc / localtime) toevoegen als volume in uw docker-container.

Update uw docker-compose.yml met de volgende regels.

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

Nu is de containertijd hetzelfde als op uw host


10
2018-06-08 15:55



Als uw op CentOS-distributiegastheer de opdracht invoert echo "Europe/Paris" > /etc/timezone voordat u de container opnieuw start. - CrazyMax
Werkt dit op een MacOS-host? - Redsandro
Werkt niet op MAC - Marcello de Sales
Dit werkte vroeger op MacOS, maar ik heb het na een lange tijd opnieuw geprobeerd en ik krijg het volgende. Niet zeker of High Sierra of een docker-wijziging dit heeft veroorzaakt: "docker: Foutreactie van daemon: Mounts denied: Het pad / etc / localtime wordt niet gedeeld vanuit OS X en is niet bekend bij Docker. U kunt gedeelde paden configureren vanuit Docker - > Voorkeuren ... -> Bestanden delen. Zie docs.docker.com/docker-for-mac/osxfs/#namespaces voor meer informatie." - gae123
Dit zal je zoneinfo db corrumperen als / etc / localtime is een symlink (dus / usr / share / zoneinfo / Some / Thing zal waarschijnlijk worden aangekoppeld als / usr / share / zoneinfo / UTC in de container). Om nog maar te zwijgen over het feit dat u het db-bestand van de host zou mengen met het bestand in de container. - ionelmc


In ubuntu 16.04 afbeelding is er bug. Oplossing was

    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



Serieus ... dit is de enige oplossing die werkte! - Gerrat
Ook moest dit doen - lijkt tzdata standaard niet meer in sommige distributies. - Peter


als u Docker-afbeelding gebruikt op basis van 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





Bedankt aan VonC voor de informatie en link naar het probleem. Dit lijkt zo'n ingewikkelde puinhoop, dus ik heb wat getest op mijn eigen idee hoe dit op te lossen en het lijkt geweldig te werken.

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

(volg de aanwijzingen om mijn tijdzone te selecteren)

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

Daarna heb ik mijn Dockerfiles bijgewerkt om dit te weerspiegelen:

FROM chocko/ubuntu:local

Er moet hier iets mis zijn omdat het te gemakkelijk lijkt om over het hoofd gezien te worden ... Of is dit acceptabel?


2
2018-04-15 19:10



Dit is ook wat ik heb geprobeerd, maar de tijdzone nog steeds reset zichzelf na I exit de houder. Dit staat op Debian. - Mike Chamberlain
@MikeChamberlain heb je toevallig het geaccepteerde antwoord van Michael Hampton geprobeerd? Ik heb het zelf niet geïmplementeerd, maar ik denk dat het de manier is om te gaan, gezien de upvotes die het heeft ontvangen. - Chockomonkey