Docker Container time & timezone (değişiklikleri yansıtmaz)

Docker konteynerleri zaman bilgilerini nereden alır? Temel ubuntu: trusty görüntüsünden bazı kaplar oluşturdum ve çalıştırdığımda ve 'tarih' istediğimde UTC saati alıyorum.

Bir süre için Dockerfile'ımda aşağıdakileri yaparak bunu atlattım:

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

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

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

Her iki yöntem doğru olsa zaman dilimini ayarlayın.

$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015

Ne verdiğini bilen var mı?

Burada gizli olduğunu dpkg-reconfigure tzdata basitçe oluşturur /etc/localtime kopya olarak, bir dosyaya sabit bağlantı veya sembolik bağlantı (sembolik bağlantı tercih edilir) /usr/share/zoneinfo. Bu nedenle, bunu tamamen Docker Dosyanızdan yapmak mümkündür. Düşünmek:

ENV TZ=America/Los_AngelesRUN 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-agnostiktir, bu yüzden hemen hemen her Linux ile çalışır.

Not: alpine tabanlı bir görüntü kullanıyorsanız, aşağıdakileri yüklemeniz gerekir: tzdata ilk. (bu soruna bakın burada)

Şuna benziyor:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

Genellikle docker kapsayıcısında aşağıdaki gibi bir ortam değişkeni ayarlamak yeterlidir:

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

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

Yerel dosyalarınızı (/etc/timezone ve /etc/localtime) docker kapsayıcınıza birim olarak ekleyebilirsiniz.

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

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

Şimdi kapsayıcı süresi ana makinenizdekiyle aynı

Montaj /etc/localtime görüntüde, bu yüzden ile senkronize edilir host -v en popüler biridir.

Ama bakın sayı 12084:

bu doğru değil çünkü yazılım bunun yerine dosyayı gerektirdiğinde çalışmıyor /etc/timezone ayarlanacak.
Bu şekilde kullandığınız varsayılan değer olarak bırakır etc/UTC.

Aslında bir docker kabının içindeki saat dilimini ayarlamanın kusursuz ve zarif bir yolu olmadığını belirledim.
Sonunda bu çözüme karar verdik:

Uygulama dockerfile:

# Relocate the timezone fileRUN 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/timezonedpkg-reconfigure -f noninteractive tzdata

Veri hacmi /config dockerfile, belirli bir ülkeye veya bölgeye yerelleştirilmiş:

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

... zarif değil çünkü 3 ayrı dosya içeriyor ve yeniden oluşturuluyor /etc/localtime her çalışma zamanı kapsayıcısını başlatın. Bu oldukça savurgan.

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

Ubuntu 16.04 görüntüsünde hata var. Çözüm şuydu:

    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

İki sentimi buraya ekliyorum, çünkü bunlardan birkaçını denedim ama hiçbiri alpine tabanlı görüntülerde çalışmadı.

Ancak, bu hile yaptı:

ENV TZ=America/TorontoRUN apk updateRUN apk upgradeRUN apk add ca-certificates && update-ca-certificatesRUN apk add --update tzdataRUN rm -rf /var/cache/apk/*

[Kaynak]

Alpine basic Görüntüsünde (örnek kullanım düğümü: 10.16.0-alpine):

Docker Dosyası

FROM node:10.16.0-alpineENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /appCOPY package.json package-lock.json ./RUN npm i --productionCOPY . .CMD node index.js

Bir Fedora kabı kullanma (muhtemelen ubuntu ile de çalışacaktır):

Bulduğum en basit çözüm docker-compose'da aşağıdakileri kullanmaktı.yml

environment:   TZ: "${TZ:-America/Los_Angeles}"

Sonra senin .env dosyası (docker-compose'un otomatik olarak okuduğu)

TZ=America/Los_Angeles

Bu, docker-compose'u koymanıza izin verir.yml sürüm denetimi altında ve özelleştirilmiş kullanın.git tarafından göz ardı edilebilecek env dosyası.

Kapsayıcı için varsayılan bir değer elde edersiniz ve her iki dünyanın da en iyisi olan özelleştirmeyi elde edersiniz.

Fedora için başka hiçbir değişiklik gerekli değildi, sadece işe yarıyor!

docker görüntüsünü temel alarak kullanıyorsanız ubuntu :

# Change the docker default timezone from UTC to SGTecho "Asia/Singapore" > /etc/timezonedpkg-reconfigure tzdatadate

Konuyla ilgili bilgi ve bağlantı için vonc'ye teşekkürler. Bu çok kafa karıştırıcı bir karmaşa gibi görünüyor, bu yüzden bunu nasıl çözeceğime dair kendi fikrim üzerinde bazı testler yaptım ve harika çalışıyor gibi 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'ımı bunu yansıtacak şekilde güncelledim:

FROM chocko/ubuntu:local

Bunda bir sorun olmalı çünkü gözden kaçırılmayacak kadar kolay görünüyor... Yoksa bu kabul edilebilir mi?