डॉकटर कंटेनर समय और समय क्षेत्र (परिवर्तनों को प्रतिबिंबित नहीं करेगा)


135

डॉकटर कंटेनरों को अपने समय की जानकारी कहाँ से मिलती है? मैंने मूल ubuntu से कुछ कंटेनर बनाए हैं: भरोसेमंद छवि, और जब मैं इसे चलाता हूं और 'तारीख' का अनुरोध करता हूं, तो मुझे यूटीसी समय मिलता है।

थोड़ी देर के लिए मैं अपने डॉकफाइल में निम्नलिखित कार्य कर रहा हूं:

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

हालांकि, किसी कारण से काम करना बंद कर दिया। ऑनलाइन खोज मैंने नीचे दिए गए सुझाव को देखा:

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

इन दोनों विधियों ने सही ढंग से समय-सीमा निर्धारित की है!

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

किसी को पता है क्या देता है?


3
यदि आप उपयोग करते हैं Alpine, तो आपको tzdataपहले स्थापित करने की आवश्यकता है , यहां देखें github.com/gliderlabs/docker-alpine/issues/136
Belter

1
FYI करें। । । मैं डॉक निर्माण / डॉकफाइल समय पर नहीं, डॉक रन के समय कंटेनर के समय को निर्धारित करना चाहता हूं। -v /etc/localtime:/etc/localtime:ro(CentOS) कार्यों का उपयोग करना । अपेक्षित समय-सीमा प्रारूप में कंटेनर कमांड-लाइन दिनांक रिटर्न दिनांक। कंटेनर में चल रहे BUT जेनकींस को लगता है कि समयक्षेत्र UTC है। क्यों? / etc / स्थानीय समय निर्मित कंटेनर में ../usr/share/zoneinfo/UTC के लिए सहानुभूति है। कंटेनर में UTC फ़ाइल की सामग्री अब नया टाइमज़ोन है। लेकिन जेनकिंस (और शायद अन्य जावा आधारित सॉफ्टवेयर) सिम्कलिन के नाम का उपयोग करते हैं जो अभी भी "यूटीसी" है। समाधान खोज रहा है। । ।
गौहिते

1
2 चीज़ों की ज़रूरत है, 1. जब कंटेनर बनाया जाता है तो सेट करने के लिए एक इनिट स्क्रिप्ट का उपयोग करें / etc / localtime symlink और / etc / timezone और 2. के लिए jenkins timezone दो जावा विकल्पों से लिया जाता है, इन विकल्पों को init स्क्रिप्ट में पास करने की आवश्यकता होती है जो जेनकिंस प्रक्रिया शुरू करता है। जैसे "-Dorg.apache.commons.jelly.tags.fmt.timeZone = अमेरिका / New_York -Duser.timezone = अमेरिका / New_York"। माफी, यह जेनकिंस विशिष्ट है, लेकिन उम्मीद है कि कुछ अन्य जेनकींस उपयोगकर्ताओं के लिए उपयोगी है।
गौइठे

जवाबों:


208

यहाँ रहस्य यह है कि dpkg-reconfigure tzdataबस /etc/localtimeएक फाइल के रूप में कॉपी, हार्डलिंक या सिमलिंक (सिम्बलिन को प्राथमिकता दी जाती है) के रूप में बनाया जाता है /usr/share/zoneinfo। तो यह पूरी तरह से आपके डॉकरफाइल से करना संभव है। विचार करें:

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

और एक बोनस के रूप में, टीबी को कंटेनर में भी सही ढंग से सेट किया जाएगा।

यह वितरण-अज्ञेयवादी भी है, इसलिए यह किसी भी लिनक्स के साथ काम करता है।

नोट: यदि आप एक अल्पाइन आधारित छवि का उपयोग कर रहे हैं तो आपको tzdataपहले स्थापित करना होगा । (इस मुद्दे को यहां देखें )

इस तरह दिखता है:

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

20
TZ नामों की सूची: en.wikipedia.org/wiki/List_of_tz_database_time_zones
BillyTom

5
उबंटू के साथ: 16.04 (और शायद अन्य संस्करण) आपको tzdataयह काम करने के लिए पैकेज स्थापित करने की आवश्यकता है ।
ओपसी

5
क्या मैं अकेला हूँ जो यह सोचता है कि डॉकफ़िले में एक टाइमज़ोन को हार्डकोड करना बहुत स्मार्ट नहीं है?
वोल्फगैंग

1
@Wolfgang यह एक उदाहरण है। आप किसी भी अन्य तरह से आप आमतौर पर इस तरह के आदेश पंक्ति, डोकर-compose.yml, आदि के रूप वातावरण चर, प्रदान करेगा में यह प्रदान कर सकते हैं
माइकल हैम्पटन

मैंने देखा कि कम से कम अल्पाइन-आधारित छवियों के लिए, बस TZचर सेट करना पर्याप्त था। मुझे सिम्लिंक्स या कुछ और सेटअप नहीं करना पड़ा।
code_dredd

58

आमतौर पर डॉकटर कंटेनर में एक पर्यावरण चर सेट करना पर्याप्त होता है, जैसे:

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

बेशक यह भी साथ काम करेगा docker-compose


2
यह सबसे सुंदर तरीका लगता है। ध्यान रखें कि कुछ आधार छवि, जैसे ubuntu:16.04, tzdataपैकेज नहीं है जिसे डॉकफाइल में जोड़ा जाना चाहिए।
जूलियन फास्ट्रे

1
+1 - मैं जूलियन से सहमत हूं; यह रनटाइम के समय क्षेत्र की स्थापना के लिए सबसे सुरुचिपूर्ण दृष्टिकोण प्रतीत होता है। यह CentOS के साथ अच्छा काम करता है। अल्पाइन छवि को 'tzdata' पैकेज की स्थापना की आवश्यकता होती है, जिसे बिल्ड समय पर हार्डकोडिंग कॉन्फ़िगरेशन पर पसंद किया जाता है जब तक कि अतिरिक्त 3MB छवि पेलोड बर्दाश्त नहीं किया जा सकता है :)
16

यह अच्छा लगता है लेकिन मेरे लिए काम नहीं करता है (CentOS 7.5.1804 और tzdata-2018e-3.el7.noarch के साथ)? दु: खी चेहरा
face

22

/etc/localtimeछवि में बढ़ते हुए, इसलिए यह host -vसबसे लोकप्रिय है।

लेकिन समस्या 12084 देखें :

यह सही नहीं है क्योंकि यह काम नहीं करता है जब सॉफ्टवेयर को /etc/timezoneसेट करने के लिए फ़ाइल की आवश्यकता होती है ।
इस तरह से आप इसे डिफ़ॉल्ट मान के रूप में छोड़ रहे हैं etc/UTC

मैंने निर्धारित किया है कि वास्तव में डॉक कंटेनर के अंदर समय क्षेत्र निर्धारित करने के लिए कोई मूर्खतापूर्ण सुरुचिपूर्ण तरीका नहीं है।
तो आखिरकार इस समाधान पर बस गए हैं:

ऐप डॉकफाइल:

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

ऐप एंट्रीपॉइंट स्क्रिप्ट:

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

डेटा वॉल्यूम /configडॉकफाइल, एक विशिष्ट देश या क्षेत्र के लिए स्थानीयकृत:

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

... यह सुरुचिपूर्ण नहीं है क्योंकि 3 अलग-अलग फाइलें शामिल हैं, और /etc/localtimeप्रत्येक रनटाइम कंटेनर पर फिर से निर्माण शुरू होता है। जो बल्कि बेकार है।

हालांकि यह ठीक से काम करता है, और सफलतापूर्वक आधार ऐप छवि और प्रत्येक देश-देश स्थानीयकृत कॉन्फ़िगरेशन के बीच अलगाव को प्राप्त करता है।
कोड की 3 लाइनों में।


1
मेरे लिए, यह था: RUN echo "Europe/London" > /etc/timezone
jpmottin

@jpmottin तो serverfault.com/a/856593/783 में थोड़ा सा ?
वॉनक

18

आप अपने स्थानीय फाइल (/ etc / timezone और / etc / localtime) को अपने डॉक-कंटेनर में वॉल्यूम के रूप में जोड़ सकते हैं।

docker-compose.ymlनिम्नलिखित लाइनों के साथ अपने अद्यतन करें ।

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

अब कंटेनर का समय आपके होस्ट पर ही है


यदि आपका CentOS डिस्ट्रिब होस्ट होस्ट echo "Europe/Paris" > /etc/timezoneकंटेनर को पुनरारंभ करने से पहले कमांड दर्ज करता है ।
क्रेजीमैक्स

क्या यह MacOS होस्ट पर काम करता है?
रेडसंड्रो

मैक में काम नहीं करता है
मार्सेलो डे सेल्स

यह MacOS पर काम करता था लेकिन मैंने इसे लंबे समय के बाद फिर से आजमाया और मुझे निम्नलिखित मिला। यकीन नहीं होता कि हाई सिएरा या एक डॉकटर ने इसका कारण बनाया: "डॉकटर: डेमॉन से त्रुटि प्रतिक्रिया: Mounts से इनकार: पथ / आदि / स्थानीय समय ओएस एक्स से साझा नहीं किया गया है और डॉकर को नहीं जाना जाता है। आप डॉकर से साझा किए गए पथ को कॉन्फ़िगर कर सकते हैं - > वरीयताएँ ... -> फ़ाइल साझाकरण। अधिक जानकारी के लिए docs.docker.com/docker-for-mac/osxfs/#namespaces देखें । "
Gae123

1
यह आपके ज़ोनइनफो db को / etc / स्थानीय रूप में भ्रष्ट कर देगा। एक सिमलिंक है (इस प्रकार / usr / share / ज़ोनइंफो / कुछ / चीज के रूप में / usr / share / ज़ोनफ़ॉइंट / UTC कंटेनर के अंदर आरोहित होने की संभावना है)। यह उल्लेख करने के लिए कि आप कंटेनर से होस्ट के साथ db फ़ाइल को मिक्स करेंगे।
आयनमेक

12

Ubuntu 16.04 छवि में बग है। समाधान था

    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
गंभीरता से ... यह एकमात्र समाधान है जो काम करता है!
गेरेट

1
यह भी करना था - लगता है कि tzdata अब डिफ़ॉल्ट रूप से कुछ विकृतियों में नहीं है।
पीटर

4

यदि आप docker की छवि का उपयोग कर रहे हैं, तो इसके आधार पर ubuntu:

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date

3

सूचना के लिए VonC का धन्यवाद और मुद्दे से जुड़ा। यह इस तरह के एक गड़बड़ गड़बड़ की तरह लगता है, इसलिए मैंने अपने स्वयं के विचार पर कुछ परीक्षण किया कि इसे कैसे हल किया जाए और यह बहुत अच्छा काम करता है।

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

(मेरे टाइमज़ोन का चयन करने के लिए संकेतों का पालन करें)

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

तब मैंने इसे दर्शाने के लिए अपने डॉकफाइल्स को अद्यतन किया:

FROM chocko/ubuntu:local

इसमें कुछ गड़बड़ होनी चाहिए क्योंकि यह अनदेखी होना बहुत आसान लगता है ... या यह स्वीकार्य है?


यह वही है जो मैंने कोशिश की थी, लेकिन टाइमजोन अभी भी खुद exitको कंटेनर के बाद रीसेट करता है । यह डेबियन पर है।
माइक चेम्बरलेन

@ माइकचैम्बरलेन क्या आप ऊपर माइकल हैम्पटन द्वारा स्वीकृत उत्तर का प्रयास करने के लिए हुआ था? मैंने इसे स्वयं लागू नहीं किया है, लेकिन मुझे लगता है कि इसे प्राप्त होने वाले उत्थान पर विचार करने का तरीका है।
चोकोमोनकी

2

यहाँ मेरे दो सेंट जोड़ना, क्योंकि मैंने इनमें से कई को आज़माया है लेकिन किसी ने अल्पाइन-आधारित छवियों पर काम नहीं किया है।

हालाँकि, इसने यह चाल चली:

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

[ स्रोत ]


1

docker runतर्कों में टाइमज़ोन सेट करने का एक अधिक सामान्य तरीका :

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

या पुन: उपयोग के लिए:

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

...
-e TZ=`GET_TZ`

अगर आपकी आधार छवि अल्पाइन (5MB) नहीं है, जिसमें "tzdata" स्थापित नहीं है
अधिकतम 4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.