Docker Container süresi ve saat dilimi (değişiklikleri yansıtmayacak)


135

Docker konteynerleri zaman bilgilerini nereden alıyorlar? Temel ubuntu'dan bazı kaplar yarattım: güvenilir görüntü; onu çalıştırıp 'tarih' istediğimde UTC zamanı alıyorum.

Bir süredir Docker dosyamda aşağıdakileri yaparak bunu çözdüm:

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

Ancak, bazı nedenlerden dolayı çalışmayı durdurdu. İnternette arama yaparken aşağıda belirtilenleri gördüm:

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

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

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

Ne verdiğini bilen var mı?


3
Eğer kullanırsanız Alpine, yüklemek için gereken tzdataburaya bakınız ilk github.com/gliderlabs/docker-alpine/issues/136
Belter

1
Bilginize. . . Konteynerin saat dilimini, liman işçisi / liman işçisi zamanında değil liman işçisi çalışma zamanında ayarlamak istiyorum. Kullanılması -v /etc/localtime:/etc/localtime:roeser (CentOS) sıralama. Kapsayıcı içindeki komut satırı tarihi, beklenen saat dilimi biçiminde tarihi döndürür. ANCAK jenkins konteynırda çalışan saat diliminin UTC olduğunu düşünüyor. Neden? / etc / localtime, oluşturulmuş kapta ../usr/share/zoneinfo/UTC ile bir bağlantıdır. Kapsayıcıdaki UTC dosyasının içeriği şimdi yeni saat dilimidir. Ancak jenkinler (ve belki de diğer java tabanlı yazılımlar), hala "UTC" olan sembolik bağlantı adını kullanır. Çözüm aranıyor. . .
Ocak’ta

1
2 şeye ihtiyacınız var: 1. kap oluşturulduğunda / etc / localtime symlink ve / etc / timezone ayarlamak için bir init betiği kullanın ve 2. jenkins timezone için iki java seçeneğinden alındığında, bu seçeneklerin init betiğine geçirilmesi gerekir. jenkins sürecini başlatır. örneğin "-Dorg.apache.commons.jelly.tags.fmt.timeZone = America / New_York -Duser.timezone = America / New_York". Özür dileriz, bu jenkins'e özgüdür, ancak bazı diğer jenkins kullanıcıları için faydalıdır.
Ocak’ta

Yanıtlar:


208

Buradaki sır, dpkg-reconfigure tzdatabasitçe /etc/localtimebir dosya için kopya, hardlink veya symlink (bir symlink tercih edilir) olarak yaratılmasıdır /usr/share/zoneinfo. Bu yüzden bunu tamamen Dockerfile’nizden 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 konteynerde de doğru şekilde ayarlanacaktır.

Bu aynı zamanda dağıtım-agnostik, bu yüzden hemen hemen herhangi bir Linux ile çalışır.

Not: Alp tabanlı bir görüntü kullanıyorsanız, tzdatailk önce onu yüklemeniz gerekir . (bu konuya buradan bakın )

Buna benzer:

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


5
Ubuntu: 16.04 (ve belki başkalarının sürümü) ile tzdatabu işlemi yapabilmek için paketin kurulu olması gerekir .
Opsse

5
Dockerfile’de bir saat dilimi kodlamanın çok akıllıca olmadığını düşünen tek kişi ben miyim?
Wolfgang

1
@Wolfgang Bu bir örnek. Normalde komut satırı, docker-compose.yml, vb. Gibi ortam değişkenleri sağlayacağınız başka bir şekilde sağlayabilirsiniz
Michael Hampton

En azından Alpine görüntüler için sadece TZdeğişkeni ayarlamanın yeterli olduğunu fark ettim . Sembolik bağlantıları veya başka bir şeyi ayarlamak zorunda değildim.
code_dredd

58

Genellikle, docker kapsayıcısında bir ortam değişkenini ayarlamak yeterlidir:

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

Tabii bu da işe yarayacaktı docker-compose.


2
Bu en zarif yol gibi görünüyor. Bazı temel görüntü gibi dikkat ubuntu:16.04, yok tzdataDockerfile eklenmelidir paketi.
Julien Fastré

1
+1 - Julien ile aynı fikirdeyim; Bu çalışma zamanında zaman dilimleri ayarlamak için en şık yaklaşım gibi görünüyor. Bu CentOS ile iyi çalışır. Alpine görüntü, fazladan 3
MB'lık

Bu iyi görünüyor ama benim için işe yaramıyor gibi görünüyor (CentOS 7.5.1804 ve tzdata-2018e-3.el7.noarch ile)? üzgün yüz
Ocak'ta gaoithe

22

/etc/localtimeGörüntüye montaj , böylece host -ven popüler olanı ile senkronize .

Ancak 12084 sayılı konuyu inceleyin :

doğru değil çünkü yazılım bunun yerine dosyanın /etc/timezoneayarlanmasını gerektirdiğinde çalışmaz .
Kullandığınız şekilde, varsayılan değer olarak bırakır etc/UTC.

Aslında bir dock konteynerinin içindeki zaman dilimini ayarlamak için kusursuz ve zarif bir yol olmadığını belirledim.
Sonunda bu çözüme karar verdim:

Uygulama liman işçisi:

# 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

/configBelirli bir ülke veya bölgeye yerelleştirilmiş veri hacmi docker dosyası:

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

... zarif değildir çünkü 3 ayrı dosya içerir ve /etc/localtimeher çalışma zamanı kapsayıcısında yeniden oluşturulur . Hangi oldukça israf edilir.

Bununla birlikte, düzgün çalışır ve temel uygulama görüntüsü ile ülke başına yerelleştirilmiş yapılandırma arasında başarıyla bir ayrım sağlar.
3 kod satırında.


1
Benim için öyleydi:RUN echo "Europe/London" > /etc/timezone
jpmottin

@jpmottin Yani biraz sonra serverfault.com/a/856593/783 ?
VonC

18

Yerel dosyalarınızı (/ etc / timezone ve / etc / localtime) liman konteynerinizde birim olarak ekleyebilirsiniz.

docker-compose.ymlAşağıdaki satırlarla sizi güncelleyin .

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

Şimdi konteyner zamanı sunucunuzdakiyle aynı


CentOS dağıtım sunucunuzda echo "Europe/Paris" > /etc/timezone, konteyneri yeniden başlatmadan önce komutu girin .
CrazyMax

Bu MacOS sunucusunda çalışıyor mu?
Redsandro


Bu, MacOS'ta çalışıyordu ancak uzun süre sonra tekrar denedim ve aşağıdakileri alıyorum. Yüksek Sierra veya liman işçisi değişiminin buna neden olup olmadığından emin değil: "liman işçisi: Daemon'dan gelen hata yanıtı: Mount reddedildi: / etc / localtime yolu OS X'den paylaşılmaz ve Docker tarafından bilinmez. Paylaşılan yolları Docker'dan yapılandırabilirsiniz - > Tercihler ... -> Dosya Paylaşımı. Daha fazla bilgi için docs.docker.com/docker-for-mac/osxfs/#namespaces adresine bakın . "
gae123

1
Bu, / etc / localtime olarak zoneinfo db'nizi bozacak (bu şekilde / usr / share / zoneinfo / Some / Thing'in / usr / share / zoneinfo / UTC olarak konteynerin içine monte edilme olasılığı vardır). Db dosyasını ana bilgisayardan kaptaki dosyayla karıştıracağınızdan bahsetmiyorum.
ionelmc

12

Ubuntu 16.04 görüntüsünde böcek 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

1
Cidden ... bu işe yarayan tek çözüm!
Gerrat

1
Ayrıca bunu yapmak zorunda kaldı - tzdata artık varsayılan olarak bazı dağıtımlarda görünmüyor.
Peter

4

Aşağıdakilere göre liman 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

Bilgilendirme ve konuyla bağlantısı için VonC'ye teşekkür ederiz. Bu çok sarsılmış bir karmaşa gibi gözüküyor, bu yüzden bunu nasıl çözeceğime dair kendi fikrimi test ettim ve harika görünüyor.

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

(saat dilimimi seçmek için yönergeleri izleyin)

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

Sonra Dockerfiles'imi bunu yansıtacak şekilde güncelledim:

FROM chocko/ubuntu:local

Bu konuda yanlış bir şeyler olmalı, çünkü gözden kaçırılması çok kolay görünüyor ... Yoksa bu kabul edilebilir mi?


Bu da denediğim şeydi, fakat saat dilimi konteynerden sonra hala kendini sıfırlıyor exit. Bu Debian'da.
Mike Chamberlain

@MikeChamberlain, yukarıdaki Michael Hampton tarafından kabul edilen cevabı denediniz mi? Kendim uygulamadım, ama sanırım aldığı en fazla oyu dikkate alarak gitmenin bir yolu.
Chockomonkey

2

Buraya iki kuruş ekledim, çünkü bunlardan bir kaçını denedim ama hiçbiri alpin temelli görüntüler üzerinde çalışmadı.

Ancak, bu hile yaptı:

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/*

[ Kaynak ]


1

Saat dilimi docker runargümanlarını ayarlamanın daha genel bir yolu :

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

Veya tekrar kullanmak için:

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

...
-e TZ=`GET_TZ`

temel görüntünüz "tzdata" yüklü olmayan bir dağ (5MB) ise yardımcı olmaz
max4ever
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.