Skąd kontenery Docker uzyskują informacje o czasie? Stworzyłem kilka kontenerów z podstawowego ubuntu: zaufanego obrazu, a kiedy go uruchamiam i żądam „daty”, otrzymuję czas UTC.
Przez jakiś czas omijałem to, wykonując następujące czynności w moim pliku Dockerfile:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
Jednak z jakiegoś powodu przestał działać. Przeszukując online zobaczyłem poniższe sugestie:
docker run -v /etc/timezone:/etc/timezone [image-name]
Obie te metody poprawnie ustawiają strefę czasową!
$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015
Czy ktoś wie, co daje?
Alpine
, musisztzdata
najpierw zainstalować , patrz tutaj github.com/gliderlabs/docker-alpine/issues/136-v /etc/localtime:/etc/localtime:ro
rodzaju prac (CentOS). W wierszu polecenia data kontenera zwraca datę w oczekiwanym formacie strefy czasowej. ALE jenkins działający w kontenerze uważa, że strefa czasowa to UTC. Dlaczego? / etc / localtime to dowiązanie symboliczne do ../usr/share/zoneinfo/UTC w wbudowanym kontenerze. Zawartość pliku UTC w kontenerze jest teraz nową strefą czasową. Ale Jenkins (i być może inne oprogramowanie oparte na Javie) używa nazwy dowiązania symbolicznego, które wciąż jest „UTC”. Poszukiwanie rozwiązania. . .Odpowiedzi:
Sekret polega na tym, że
dpkg-reconfigure tzdata
po prostu tworzy/etc/localtime
jako kopię, hardlink lub dowiązanie symboliczne (preferowane jest dowiązanie symboliczne) do pliku w/usr/share/zoneinfo
. Można to zrobić całkowicie z pliku Docker. Rozważać:Jako bonus, TZ również zostanie poprawnie ustawiony w kontenerze.
Jest to również niezależne od dystrybucji, więc działa z prawie każdym Linuksem.
Uwaga: jeśli używasz obrazu alpejskiego, musisz zainstalować
tzdata
pierwszy. (zobacz ten problem tutaj )Wygląda tak:
źródło
tzdata
zainstalowany pakiet, aby to działało.TZ
zmiennej. Nie musiałem konfigurować dowiązań symbolicznych ani niczego innego.Zwykle wystarczy ustawić zmienną środowiskową w kontenerze dokowanym, na przykład:
Oczywiście to też zadziała
docker-compose
.źródło
ubuntu:16.04
, nie zawieratzdata
pakietu, który powinien zostać dodany w Dockerfile.Najbardziej popularny jest montaż
/etc/localtime
na obrazie, więc jest on zsynchronizowany z obrazemhost -v
.Ale patrz problem 12084 :
źródło
RUN echo "Europe/London" > /etc/timezone
Możesz dodać swoje lokalne pliki (/ etc / timezone i / etc / localtime) jako wolumin w kontenerze dokera.
Zaktualizuj swoje
docker-compose.yml
za pomocą następujących wierszy.Teraz czas kontenera jest taki sam jak na twoim hoście
źródło
echo "Europe/Paris" > /etc/timezone
przed ponownym uruchomieniem kontenera.W obrazie Ubuntu 16.04 jest błąd. Rozwiązaniem było
źródło
jeśli używasz obrazu dokera na podstawie
ubuntu
:źródło
Dzięki VonC za informację i link do problemu. To wydaje się być tak zawiłym bałaganem, więc przetestowałem mój własny pomysł na rozwiązanie tego problemu i wydaje się, że działa świetnie.
(postępuj zgodnie z instrukcjami, aby wybrać moją strefę czasową)
Następnie zaktualizowałem moje pliki Docker, aby odzwierciedlić to:
Coś musi być z tym nie tak, ponieważ wydaje się, że zbyt łatwo go przeoczyć ... Czy to jest do przyjęcia?
źródło
exit
kontenerze. To jest na Debianie.Dodając tutaj moje dwa centy, ponieważ próbowałem kilku z nich, ale żadne nie działało na obrazach alpejskich.
Jednak to załatwiło sprawę:
[ Źródło ]
źródło
Bardziej ogólny sposób ustawiania strefy czasowej w
docker run
argumentach:Lub do ponownego użycia:
źródło