Soru Docker Konteyneri süresi ve saat dilimi (değişiklikleri yansıtmaz)


Docker konteynerleri zaman bilgisini nereden alır? Temel ubuntu'dan bazı kapsayıcılar oluşturdum: güvenilir görüntü, ve çalıştırdığımda ve 'tarih' istediğimde, UTC zamanı alıyorum.

Bir süredir Dockerfile'ımda aşağıdakileri yaparak etrafta dolaştım:

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

Ancak, bazı nedenlerle çalışmayı durdurdu. İnternette arama yaparken aşağıdaki önerileri gördüm:

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

Her iki yöntem de zaman dilimini doğru bir şekilde ayarladı!

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

Kim ne verdiğini biliyor mu?


76
2018-04-14 23:49


Menşei


Eğer kullanırsan Alpine, yüklemelisin tzdata önce, buraya bakın github.com/gliderlabs/docker-alpine/issues/136 - Belter


Cevaplar:


Buradaki sır şu ki dpkg-reconfigure tzdata sadece oluşturur /etc/localtime bir dosyaya bir kopya, hardlink veya symlink (bir sembolik bağlantı) tercih edilir. /usr/share/zoneinfo. Yani bunu tamamen Dockerfile'ınızdan yapmak mümkündür. Düşünmek:

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

Ve bir bonus olarak, TZ de konteynerde doğru şekilde ayarlanacaktır.

Bu da dağıtım-agnostiktir, bu yüzden hemen hemen her Linux ile çalışır.

Not: Alp tabanlı bir görüntü kullanıyorsanız, tzdata ilk. (bu konuya bakın İşte)

Buna benzer:

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

127
2018-04-17 19:55



TZ isimlerinin listesi: en.wikipedia.org/wiki/List_of_tz_database_time_zones - BillyTom
Ubuntu ile: 16.04 (ve belki başka bir sürümü) sahip olmanız gerekir tzdata Bu işi yapmak için yüklü paket. - Opsse
Dockerfile'da bir saat dilimini kodlamak için çok akıllı olmadığını düşünen tek kişi ben miyim? - Wolfgang
@Wolfgang Bu bir örnektir. Komut satırı, docker-compose.yml, vb. Gibi ortam değişkenlerini normalde sağladığınız şekilde sağlayabilirsiniz. - Michael Hampton♦


Genellikle, docker kabında bir ortam değişkeni ayarlamak yeterlidir;

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

Tabii ki bu da docker-compose.


33
2018-01-13 22:15



Bu en şık yol gibi görünüyor. Bazı temel görüntülere dikkat edin ubuntu:16.04, sahip değil tzdata Dockerfile eklenmesi gereken paket. - Julien Fastré
+1 - Julien ile aynı fikirdeyim; Bu, çalışma zamanında saat dilimlerini ayarlamak için en zarif yaklaşım gibi görünüyor. Bu CentOS ile iyi çalışır. Alp görüntüsü ekstra 3MB görüntü yükü tolere edilemezse, harcanan konfigürasyonların yapım süresinde tercih edilen 'tzdata' paketinin kurulumunu gerektirir. - Frelling


Montaj /etc/localtime görüntüde, bu nedenle host -v en popüler olanıdır.

Ama bakın 12084 sayı:

doğru değil, çünkü yazılım bunun yerine dosya gerektirdiğinde işe yaramıyor /etc/timezone ayarlanacak.
  Kullandığınız bu şekilde varsayılan değer olarak bırakır etc/UTC.

Aslında, bir docker kabının içindeki saat dilimini ayarlamak için kusursuz bir zarif yolun olmadığını belirledim.
  Sonunda bu çözüme yerleşti:

Uygulama dockerfile:

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

Uygulama giriş noktası komut dosyası:

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

Veri hacmi /config Belirli bir ülke veya bölgeye yerel olarak yerleştirilmiş dockerfile:

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

... 3 ayrı dosyaların dahil edilmesi ve yeniden yaratılması nedeniyle zarif değildir. /etc/localtime her çalışma zamanı kapsayıcısında başlat. Hangi daha savurgan.

Bununla birlikte, düzgün çalışır ve temel uygulama görüntüsü ile ülke başına yerelleştirilmiş yapılandırma arasındaki ayrımı başarılı bir şekilde gerçekleştirir.
  3 satırlık kodda.


16
2018-04-15 06:14



Benim için öyleydi: RUN echo "Europe/London" > /etc/timezone - jpmottin
jpmottin Yani biraz gibi serverfault.com/a/856593/783 sonra? - VonC


Docker-konteynerinizde yerel dosyalarınızı (/ etc / timezone ve / etc / localtime) hacim olarak ekleyebilirsiniz.

Güncelleyin docker-compose.yml aşağıdaki satırlarla.

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

Şimdi kapsayıcı süre, sunucunuzdakiyle aynı


10
2018-06-08 15:55



CentOS dağıtım sunucunuzda komuta girerseniz echo "Europe/Paris" > /etc/timezone kabı yeniden başlatmadan önce. - CrazyMax
Bu MacOS ana bilgisayarda çalışıyor mu? - Redsandro
MAC'de çalışmıyor - Marcello de Sales
Bu MacOS üzerinde çalışıyordu ama uzun bir süre sonra tekrar denedim ve aşağıdakileri aldım. High Sierra ya da bir docker değişikliğinin buna neden olup olmadığından emin değil: "docker: Arka plandaki hata yanıtı: Bağlar reddedildi: Yol / etc / localtime, OS X'den paylaşılmıyor ve Docker tarafından bilinmemektedir. Docker'dan paylaşılan yolları yapılandırabilirsiniz. > Tercihler ... -> Dosya Paylaşımı docs.docker.com/docker-for-mac/osxfs/#namespaces daha fazla bilgi için." - gae123
Bu sizin / etc / localtime bir sembolik olarak zonunfo db olarak bozulacaktır (böylece / usr / share / zoneinfo / Bazı / Thing kabın içinde / usr / share / zoneinfo / UTC olarak monte edilir). Db dosyasını ana bilgisayardan kapsayıcıdaki ile karıştırdığınızı belirtmeyin. - ionelmc


Ubuntu 16.04 görüntüsünde hata var. Çözüm oldu

    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



Cidden ... bu işe yarayan tek çözüm! - Gerrat
Ayrıca bunu yapmak zorunda kaldı - tzdata artık varsayılan olarak bazı dağıtımlarda değil. - Peter


dayalı docker görüntü kullanıyorsanız 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





Bu konuyla ilgili bilgi ve bağlantı için VonC'ye teşekkürler. Bu böyle kıvrımlı bir karmaşaya benziyor, bu yüzden nasıl çözeceğime dair kendi fikrimi test ettim ve harika çalışıyor gibi görünüyor.

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

(Zaman dilimi seçmek için uyarıları takip et)

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

Sonra Dockerfiles'imi bunu yansıtmak için güncelledim:

FROM chocko/ubuntu:local

Bu konuda yanlış bir şey olmalı çünkü göz ardı edilmemesi çok kolay görünüyor ... Yoksa bu kabul edilebilir mi?


2
2018-04-15 19:10



Bu da denediğim şeydi, ama saat dilimi yine kendimden sonra kendini sıfırlar exit konteyner Bu Debian'da. - Mike Chamberlain
@MikeChamberlain, yukarıda Michael Hampton tarafından kabul edilen cevabı denediniz mi? Kendimi uygulamamıştım, ama aldığım upvotları dikkate almanın yolu olduğunu düşünüyorum. - Chockomonkey