डॉकटर कंटेनर में सिस्टम समय को गतिशील रूप से कैसे सेट करें


28

मेजबान मशीन को प्रभावित किए बिना डॉकटर कंटेनर सिस्टम समय को गतिशील रूप से (रन समय में) सेट करने का कोई तरीका है?

का उपयोग करते हुए

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

निम्नलिखित त्रुटि देता है:

hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.

का उपयोग करते हुए

date -s "2 OCT 2006 18:00:00"

निम्नलिखित त्रुटि देता है:

date: cannot set date: Operation not permitted

उदाहरण:

मुझे समय संवेदनशील सॉफ़्टवेयर का परीक्षण करने की आवश्यकता है (व्यवहार तिथि पर निर्भर करता है)।

अन्य सामान्य उपयोग के मामले:

  • y2k बग के साथ विरासत सॉफ्टवेयर चलाना
  • वर्ष 2038 अनुपालन के लिए परीक्षण सॉफ्टवेयर
  • समय-संबंधित समस्याओं को डीबग करना, जैसे कि समय सीमा समाप्त SSL प्रमाणपत्र
  • रनिंग सॉफ्टवेयर जो एक निश्चित समय सीमा के बाहर चलना बंद कर देता है
  • नियतात्मक निर्माण प्रक्रियाएँ।

ऐसा करने का उद्देश्य क्या होगा? आपका उपयोग मामला क्या है?
दाऊद

कृपया संपादन देखें।
Vingtoft


1
वास्तव में, मैं बस पाया और सकारात्मक रूप से libfaketime github.com/wolfcw/libfaketime का उपयोग करके एक समाधान का परीक्षण किया, मैं शीघ्र ही एक जवाब + काम के उदाहरण के साथ अपडेट करूंगा।
विंगटॉफ्ट

जवाबों:


21

हो सकता

इसका समाधान कंटेनर में नकली है। यह lib वर्तमान समय और दिनांक को पुनः प्राप्त करने के लिए उपयोग किए जाने वाले सभी सिस्टम कॉल प्रोग्राम को इंटरसेप्ट करता है।

कार्यान्वयन आसान है। उपयुक्त के रूप में अपने डॉकफाइल में कार्यक्षमता जोड़ें:

WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install

LD_PRELOADइससे पहले कि आप जिस अनुप्रयोग को लागू करना चाहते हैं, उसे चलाने से पहले पर्यावरण चर को सेट करना याद रखें ।

उदाहरण:

CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]

अब आप गतिशील रूप से सर्वर समय बदल सकते हैं:

उदाहरण:

import os
def set_time(request):
    print(datetime.today())
    os.environ["FAKETIME"] = "2020-01-01"  # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d"
    print(datetime.today())

6
इस समाधान के लिए आने वाले अन्य लोगों के लिए, इस बात से अवगत रहें कि यह गोलगप्पे के अनुप्रयोगों या अन्य वैधानिक रूप से जुड़े एक्जिट के लिए काम नहीं करेगा।
प्रहरी

5
साभार @Sentinel मजेदार रूप से पर्याप्त है, मुझे यह उत्तर Google के माध्यम से मिला, मैं विशेष रूप से इसे एक गोलगप्पे ऐप के साथ उपयोग करना चाहता हूं, और मैंने देखा कि आपने इस टिप्पणी को सिर्फ 2 घंटे पहले 1.5 साल पुराने प्रश्न पर छोड़ दिया था। ऐसा लगता है कि यह मेरे लिए था। धन्यवाद! :)
डिमोनोमिड

आपकी स्थिति में काम क्यों नहीं हो रहा है? क्या गोलंग समय को पुनः प्राप्त करने के लिए सिस्टम कॉल का उपयोग नहीं करता है? @dimonomid मेरा सुझाव है कि आप इसे आजमाएं, समाधान को लागू करना त्वरित है।
विंग्टॉफ्ट

1
@Vingtoft मुझे बताएं कि क्या यह वास्तव में काम करता है, लेकिन चारों ओर खोजें। गोलंग पुस्तकालयों में गतिशील रूप से लिंक नहीं करता है।
प्रहरी

1
@dimonomid हाँ, मैं बहुत निराश था। डॉकटर के साथ वास्तव में अधिक निराश। मुझे समय से संबंधित परीक्षणों को लागू करने की आवश्यकता है। यह डॉकर को "कंटेनर" के रूप में बहुत बेकार बना देता है। मैंने सोचा होगा कि टाइमजोन सिंक के लिए सिस्टम टाइम कॉल को इंटरसेप्ट करने के लिए डॉकर एजेंडा में आइटम 1 रहा होगा। जाहिरा तौर पर नहीं।
प्रहरी

4

जेनी डी सही है कि डिफ़ॉल्ट रूप से डॉकर कंटेनर सिस्टम घड़ी तक पहुंच की अनुमति नहीं देता है।

हालाँकि, लिनक्स पर, यदि आप इस क्षमता तक पहुँचने वाले अपने कंटेनर के साथ ठीक हैं, तो आप कंटेनर बनाते समय "docker run" कमांड के "--cap-add = SYS_TIME" विकल्प का उपयोग करके इस क्षमता की अनुमति दे सकते हैं:

# docker run --cap-add=SYS_TIME -d --name teamcity-server-instance -v /opt/teamcity/data:/data/teamcity_server/datadir -v /opt/teamcity/logs:/opt/teamcity/logs -p 80:8111 jetbrains/teamcity-server

फिर, आप चल रहे कंटेनर के अंदर से समय बदल सकते हैं:

# docker exec -it teamcity-server-instance /bin/bash
# date +%T -s "15:03:00"
15:03:00
#

संदर्भ प्रलेखन: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities


2
इससे होस्ट मशीन पर समय बदल जाता है। लिनक्स सिस्टम पर समय का नाम अभी नहीं रखा गया है, मेजबान और सभी कंटेनरों के लिए केवल एक मूल्य है।
BMitch

हाँ तुम सही हो। इससे मेजबान मशीन की घड़ी का समय बदल जाता है। बस प्रश्न को फिर से पढ़ें और प्रश्न का एहसास करें, वास्तव में, मेजबान मशीन की घड़ी को नहीं बदलने के बारे में स्पष्ट रूप से उल्लेख किया गया है। मैं सही खड़ा हूं :)
ओलेग काजाकोव

0

एक अतिरिक्त पर्यावरण चर के साथ कंटेनर शुरू करें:

docker run -e "SET_CONTAINER_TIMEZONE=true" \
           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]

Im समय को गतिशील रूप से सेट करने का एक तरीका खोज रहा है, जिसका अर्थ है कि इसे रनटाइम पर सेट किया जा सकता है। मैंने अपना प्रश्न अपडेट कर दिया है।
विंग्टॉफ्ट

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