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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

लेकिन देखें अंक 12084:

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

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

एप्लिकेशन dockerfile:

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

एप्लिकेशन entrypoint स्क्रिप्ट:

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

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

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

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

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

उबंटू 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

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

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

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

[स्रोत]

अल्पाइन मूल छवि में (उदाहरण नोड का उपयोग करें: 10.16.0-अल्पाइन):

Dockerfile

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

फेडोरा कंटेनर का उपयोग करना (उबंटू के साथ भी काम करने की संभावना):

मैंने पाया कि सबसे सरल समाधान डॉकर-कंपोज़ में निम्नलिखित का उपयोग करना था । yml

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

फिर अपने में । एनवी फ़ाइल (जो डॉकर-कंपोज़ स्वचालित रूप से पढ़ता है)

TZ=America/Los_Angeles

यह आपको डॉकर-कंपोज़ डालने की अनुमति देता है । संस्करण नियंत्रण के तहत वाईएमएल और एक अनुकूलित का उपयोग करें । एनवी फ़ाइल जिसे गिट द्वारा अनदेखा किया जा सकता है ।

आपको कंटेनर के लिए एक डिफ़ॉल्ट मान मिलता है और आपको अनुकूलन मिलता है, दोनों दुनिया के सर्वश्रेष्ठ ।

फेडोरा के लिए कोई अन्य परिवर्तन आवश्यक नहीं थे, यह सिर्फ काम करता है!

यदि आप के आधार पर डॉकर छवि का उपयोग कर रहे हैं ubuntu :

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

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

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

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

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

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

FROM chocko/ubuntu:local

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