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

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

का उपयोग करना

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

केस का उपयोग करें:

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

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

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

यह संभव है

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

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

WORKDIR /RUN git clone https://github.com/wolfcw/libfaketime.gitWORKDIR /libfaketime/srcRUN 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 osdef 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())

यहाँ है docker-compose समाधान:

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

इसे जांचें लिंक एक उदाहरण पाने के लिए ।

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

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

दरअसल, मैंने अभी-अभी लिबफैकटाइम का उपयोग करके एक समाधान पाया और सकारात्मक रूप से परीक्षण किया

मैं जल्द ही एक उत्तर + कार्य उदाहरण के साथ अपडेट करूंगा ।

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

कृपया संपादित करें देखें।