मेजबान के साथ डॉकटर का समय कैसे सुनिश्चित करें?


84

मेरे पास लाइनकोड सर्वर पर चलने वाले डॉकर्स हैं। कई बार, मैं देखता हूं कि डॉकर्स पर समय सही नहीं है। वर्तमान में मैंने कोड की निम्नलिखित पंक्तियों को शामिल करने के लिए प्रत्येक डॉक में रन स्क्रिप्ट को बदल दिया है।

yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org

हालांकि मैं आदर्श रूप से ऐसा करना चाहूंगा कि डॉकटर को मेजबान के साथ समय सिंक करना चाहिए। क्या इसे करने का कोई तरीका है?



कंटेनर मेजबान के समान समय का उपयोग करेगा। डॉक कोर कोर डेवलपर्स में से एक के जवाब के साथ इस प्रश्नोत्तर देखें ।
बेन व्हैले

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

9
चेतावनी : मेजबान क्या है, इसके बारे में कुछ भ्रम है। Linux सबसिस्टम के साथ linux और Windows 10+ के अलावा अन्य ऑपरेटिंग सिस्टम पर, docker मशीन (होस्ट) वास्तव में एक वर्चुअल मशीन है। जब डॉक होस्ट एक ही मशीन नहीं है जिस dockerपर आप कमांड चला रहे हैं , तो आपको समय तिरछा दिखाई दे सकता है, और वॉल्यूम बढ़ने जैसी चीजें काम नहीं करेंगी जैसा कि आप उम्मीद कर सकते हैं। यह तब भी होता है जब आप एक दूरस्थ docker मशीन स्थापित करते हैं, जैसे DigitalOcean पर।
कोडबलिंग 22

जवाबों:


84

इस उत्तर के लिए स्रोत उत्तर पर टिप्पणी है: मेजबान मशीन के साथ docker कंटेनर ऑटो सिंक समय होगा?

जवाब देखने के बाद, मुझे एहसास हुआ कि डॉक कंटेनर पर एक घड़ी का बहाव नहीं होगा। डॉकर मेजबान के रूप में एक ही घड़ी का उपयोग करता है और डॉकटर इसे बदल नहीं सकता है। इसका अर्थ है कि ntpdateकर्ता के अंदर काम नहीं करता है।

सही काम यह है कि होस्ट समय का उपयोग करके अपडेट किया जाए ntpdate

जहाँ तक टाइमज़ोन समन्‍वयित करने का -v /etc/localtime:/etc/localtime:roकार्य है।


4
मुझे बताओ कि यह कैसे हो सकता है? अगर डकेट सिस्टम जैसी ही घड़ी का उपयोग करता है। होस्ट से डॉक घड़ी कैसे अलग हो सकती है। यदि क्लॉक ड्रिफ्ट होता है, तो यह डॉकर की होस्ट मशीन पर होगा, जहां क्लॉक ड्रिफ्ट को ठीक करने की आवश्यकता होती है। मुझे यह जानने में दिलचस्पी होगी कि क्या मैं गलत हूं।
रंजीथ रामचंद्र

10
बूट 2docker के साथ मैक पर Docker का उपयोग करते समय, boot2docker VM समय खो सकता है। डॉकर अपने मेजबान के साथ इन-सिंक रहता है, लेकिन इसका मेजबान गलत समय प्रदान करता है। VM को रीबूट करना इसके लिए सबसे सरल फिक्स है।
नथानिएल वैबब्रोट

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

3
@ISJ: boot2docker restartया यदि आप अपना खुद का VM चलाते हैं तो आप ntpdateवहां जा सकते हैं।
नथानिएल वैबब्रोट 18

5
मैं विंडोज पर हूँ। मेजबान मशीन का समय 15:06 है, कंटेनर का समय 18:41 है ... wtf
willem

37

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

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

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

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


अच्छा और साफ! ty!
विप्रो

35

यदि आप boot2docker का उपयोग कर रहे हैं और ntp docker VM के अंदर काम नहीं करता है (आप एक प्रॉक्सी के पीछे हैं जो ntp पैकेट को आगे नहीं बढ़ाती है), लेकिन आपका होस्ट समय-समकालिक है, तो आप अपने होस्ट से निम्न चला सकते हैं:

docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

इस तरह से आप अपने मशीन के वर्तमान समय (यूटीसी टाइमज़ोन में) को स्ट्रिंग के रूप में डॉक वीएम समय का उपयोग करके date(फिर से यूटीसी टाइमज़ोन में) सेट करने के लिए भेज रहे हैं ।

नोट: विंडोज में, बैश शेल के अंदर (msys git से), उपयोग करें:

docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

उत्तम! यह वास्तव में मेरी समस्या थी और यह डॉकटर-मशीन को रीबूट करने की आवश्यकता के बिना इसे तुरंत ठीक कर देता है।
क्वर्टीजगुई

1
क्या सेकंड सेट करना संभव है? मैंने% S जोड़ने की कोशिश की लेकिन मुझे अमान्य समय मिलता है
सकीब

@ साकिब, dateकमांड केवल MMDDhhmm[[CC]YY][.ss]तिथि निर्धारित करने के प्रारूप को स्वीकार करता है , इसलिए सेकंड जोड़ने के लिए, आपको उन्हें स्ट्रिंग के अंत में इस तरह से डालने की आवश्यकता है +%m%d%H%M%Y.%S:।
gvlx

28

यह मेरे लिए फेडोरा 20 होस्ट के साथ काम करता है। मैंने एक कंटेनर का उपयोग करके भाग लिया:

docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

शुरू /etc/localtimeमें /usr/share/zoneinfo/Asia/Kolkataभारतीय मानक समय के लिए एक नरम लिंक था । dateकंटेनर के अंदर निष्पादन ने मुझे उसी समय दिखाया जैसा कि मेजबान पर था। मैं खोल से बाहर निकल गया और कंटेनर का उपयोग बंद कर दिया docker stop <container-id>

इसके बाद, मैंने इस फ़ाइल को हटा दिया और इसे /usr/share/zoneinfo/Singaporeपरीक्षण के उद्देश्य से लिंक कर दिया । मेजबान समय सिंगापुर समय क्षेत्र के लिए निर्धारित किया गया था। और फिर किया docker start <container-id>। फिर अपने खोल को फिर से उपयोग करके पहुँचा nsenterऔर पाया कि अब समय सिंगापुर समय क्षेत्र के लिए निर्धारित किया गया था।

docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash

तो यहां कुंजी का उपयोग करना है -v /etc/localtime:/etc/localtime:roजब आप पहली बार कंटेनर चलाते हैं। मैंने इसे इस लिंक पर पाया ।

आशा है कि इससे सहायता मिलेगी।


यह मेरे लिए एक CentOS Linux रिलीज 7.6.1810
k4cy

26

यह docker सर्वर में समय को रीसेट करेगा:

docker run --rm --privileged alpine hwclock -s

अगली बार जब आप एक कंटेनर बनाते हैं तो घड़ी सही होनी चाहिए।

स्रोत: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995


3
अब यही वह रहस्य है जिसकी मुझे तलाश थी! दिनों से बंद था और certs क्रोधी थे। धन्यवाद!
योशिय्याह

2
इसके लिए धन्यवाद। एक जादू की तरह काम किया।
रयान न्यूट

डॉकटर-कंपोज के साथ इसका उपयोग कैसे करें?
सूर्या स्वानॉफ

1
मैं देख रहा था कि सोते हुए बग के बाद विंडोज के लिए ज्यादा समय तक डॉकिंग करने वाला नहीं है, यह फिक्स जादू की तरह काम करता है! यह क्या कर रहा हैं?
स्टैकग

11

यदि आप docker- मशीन का उपयोग कर रहे हैं, तो वर्चुअल मशीन बहाव कर सकती हैं। वर्चुअल मशीन पर घड़ी को फिर से चलाने के बिना अपडेट करने के लिए:

docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org

यह एनटीपी का उपयोग करके वर्चुअल मशीन पर घड़ी को अपडेट करेगा और फिर लॉन्च किए गए सभी कंटेनरों की सही तारीख होगी।


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

10

मैं -1 घंटे और 4 मिनट के समय की कमी का सामना कर रहा था

डॉकटर को पुनः आरंभ करना ही मेरे लिए मुद्दा तय करता है।

सामान्य रूप में टाइमज़ोन सेट करने के लिए:

  1. आपके कंटेनर में ssh: docker exec -it my_website_name bash

  2. Daud dpkg-reconfigure tzdata

  3. Daud date

इसने मेरे लिए कंसोल से macOS हाई सिएरा 10.13.6 (17G65) पर डॉकटर - कंपोज़ का उपयोग कर काम किया :docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
Zack Morris

9

ऐसा प्रतीत होता है कि यदि आप डॉकर मशीन का उपयोग कर रहे हैं तो समय के साथ बहाव हो सकता है, क्योंकि यह प्रतिक्रिया बताती है: https://stackoverflow.com/a/26454059/105562 , VirtualBox के कारण।

त्वरित और आसान फिक्स बस अपने वीएम को पुनः आरंभ करना है:

docker-machine restart default

1
docker विंडो में कोई डिफॉल्ट मशीन नहीं थी, मैंने
docker

9

मेरे पास कंपोज फाइल में निम्नलिखित है

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

फिर Gerrit में सभी अच्छे अपने replication_log सही टाइमस्टैम्प के साथ सेट के साथ।


मेरे पास सेंटोस (7) होस्ट में डेबियन (9) कंटेनर हैं, और बढ़ते स्थानीय समय काम करता है, लेकिन टाइमज़ोन नहीं कर सकता, क्योंकि होस्ट पर यह कंटेनर में निर्देशिका है जबकि यह फ़ाइल है।
रात्रि

6

MacOS पर docker के लिए, आप docker-time-सिंक-एजेंट का उपयोग कर सकते हैं । इससे मेरा काम बनता है।


जाहिरा तौर पर यह अब तय हो गया है github.com/docker/for-mac/issues/17
रयान आर

सिंक से बाहर का समय अभी भी docker version 18.03.1-ce-mac65 पर होता है, और यह समाधान इसे ठीक करता है।
हाना अलायड्र्स

5

खिड़कियों के लिए डॉक करने के साथ मुझे टिक करना पड़ा

MobyLinuxVM > Settings > Integration Services > Time synchronization 

हाइपर- V प्रबंधक में और यह काम किया


हालांकि एक समस्या है। ऐसा लगता है कि आपके द्वारा होस्ट को पुनरारंभ करने के बाद सेटिंग
अप्रयुक्त है

हाँ - कुछ विंडो बिल्ड पर ऐसा लगता है (देखें github.com/docker/for-win/issues/409 )
क्रिश्चियन Opitz

1
मेरे मामले में, वह चेकबॉक्स पहले से ही चेक किया हुआ है, लेकिन कंटेनर समय होस्ट समय से तीन दिन पीछे है।
स्कॉट हचिंसन

5

docker- रचना का उपयोग:

जोड़े /etc/localtime:/etc/localtime:roको volumesविशेषता:

version: '3'

services:
  a-service:
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro

3

हालांकि यह प्रत्येक मेजबान के लिए एक सामान्य समाधान नहीं है, कोई इसे उपयोगी पा सकता है। यदि आप जानते हैं कि आप कहां हैं (मेरे लिए यूके) तो यहांtianon's जवाब देखें ।

FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London

यह वही है जो मैंने अपने डॉकरफाइल ^ में जोड़ा और टाइमजोन समस्या को ठीक किया गया।


1

मुझे पता चला है कि यदि आपका कंप्यूटर सो जाता है तो डॉकटर कंटेनर सिंक से बाहर चला जाता है।

https://forums.docker.com/t/time-in-container-is-out-of-sync/16566

मैंने इसके बारे में एक पोस्ट किया है यहां सर्टिफिकेट हमेशा डोकर में 5 दिन पहले समाप्त हो जाता है


1

डॉकटर उपयोग

यहां एक संपूर्ण उदाहरण है जो मल्टीस्टेज बिल्ड में एक गो ऐप के लिए डॉक इमेज बनाता है। यह दिखाता है कि अपनी छवि में समयक्षेत्र को कैसे शामिल किया जाए।

FROM golang:latest as builder

WORKDIR /app

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main

### Certs
FROM alpine:latest as locals

RUN apk --update --no-cache add ca-certificates

RUN apk add --no-cache tzdata

### App
FROM scratch 

WORKDIR /root/

COPY --from=locals /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

COPY --from=builder app/main .

COPY --from=builder app/templates ./templates

COPY --from=locals /usr/share/zoneinfo /usr/share/zoneinfo

ENV TZ=Asia/Singapore

EXPOSE 8000

CMD ["./main"]

1

मेरे लिए, डॉकर डेस्कटॉप को पुनरारंभ करने से मदद नहीं मिली। Win10 को बंद करके इसे फिर से शुरू करें, इसने मदद की।


1

विंडोज उपयोगकर्ता:

समाधान बहुत सरल है। बस एक शक्तियां शीघ्र खोलें और दर्ज करें:

docker run --privileged --rm alpine date -s "$(Get-Date ([datetime]::UtcNow) -UFormat "+%Y-%m-%d %H:%M:%S")"

यह जाँचने के लिए कि यह काम करता है, कमांड चलाएँ:

docker run --rm -it alpine date


मेरा समाधान कुछ ऐसा है जो मुझे डॉक फोरम थ्रेड में मिला है, उससे प्रेरित है। वैसे भी, यह एकमात्र समाधान था जो मेरे लिए डॉकटर डेस्कटॉप पर काम करता था, मेरी मशीन को फिर से शुरू करने के अलावा (जो काम भी करता है)। यहाँ मूल धागे के लिए एक कड़ी है: https://forums.docker.com/t/syncing-clock-with-host/10432/23

थ्रेड उत्तर और मेरा के बीच का अंतर यह है कि मेरा समय यूटीसी समय में परिवर्तित हो जाता है, जो उदाहरण के लिए आवश्यक है जैसे एडब्ल्यूएस। अन्यथा, मंच से मूल उत्तर इस तरह दिखता है:

docker run --privileged --rm alpine date -s "$(date -u "+%Y-%m-%d %H:%M:%S")"


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.