ডকার পাত্রে কীভাবে সিস্টেমের সময়কে গতিময়ভাবে সেট করবেন


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 বাগ সহ উত্তরাধিকারী সফ্টওয়্যার চলছে
  • বছর -3838 সম্মতি জন্য পরীক্ষার সফ্টওয়্যার
  • ডিবাগিং সময় সম্পর্কিত সমস্যাগুলি যেমন মেয়াদ শেষ হওয়া এসএসএল শংসাপত্রগুলি
  • চলমান সফ্টওয়্যার যা নির্দিষ্ট সময়সীমার বাইরে চলে যায়
  • নির্মাতারা বিল্ড প্রক্রিয়া

কী করার উদ্দেশ্য হবে? আপনার ব্যবহারের ক্ষেত্রে কী?
দাউদ

সম্পাদনা দেখুন।
ভিংটোফ্ট


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
ধন্যবাদ @ সেন্টিনেল আনন্দের সাথে যথেষ্ট, আমি এই উত্তরটি গুগলের মাধ্যমে খুঁজে পেয়েছি, আমি বিশেষত এটি একটি গোলং অ্যাপ্লিকেশন দিয়ে ব্যবহার করতে চাই এবং আমি লক্ষ্য করেছি যে আপনি এই মন্তব্যটি 1.5 ঘন্টা পুরানো প্রশ্নটিতে মাত্র 2 ঘন্টা আগে রেখে গেছেন। মনে হয় এটা আমার জন্য ছিল। ধন্যবাদ! :)
ডায়মনোমিড

আপনার পরিস্থিতিতে কাজ হয় না কেন? গোলং কি পুনরুদ্ধার করার জন্য সিস্টেম কলগুলি ব্যবহার করে না? @ ডিমনোমিড আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এটি ব্যবহার করে দেখুন, সমাধানটি কার্যকর করার জন্য এটি দ্রুত।
ভিংটোফট

1
@ উইংটোফট আমাকে জানাবেন যে এটি আসলে কাজ করে কিনা তবে চারপাশে অনুসন্ধান করুন। গোলং লাইব্রেরিতে গতিশীলভাবে লিঙ্ক দেয় না।
সেন্টিনেল

1
@ ডিমনোমিড হ্যাঁ আমি বেশ হতাশ ছিলাম। প্রকৃতপক্ষে ডকারের সাথে আরও হতাশ। আমার সময় সম্পর্কিত পরীক্ষাগুলি প্রয়োগ করতে হবে। এটি একটি "ধারক" হিসাবে ডকারকে বেশ বেশি অকেজো করে তোলে। আমি ভেবেছিলাম ডকারের কার্যসূচিতে টাইমজোন সিঙ্কের জন্য সিস্টেম টাইম কলগুলি আইটেম 1 হত। দৃশ্যত না.
সেন্টিনেল

4

জেনি ডি এতে সঠিক যে ডিফল্টরূপে ডকারের ধারকটি সিস্টেমের ঘড়িতে অ্যাক্সেসের অনুমতি দেয় না।

তবে, লিনাক্সে, আপনি যদি নিজের ধারকটির এই সক্ষমতার অ্যাক্সেসের সাথে ভাল থাকেন তবে আপনার ধারক তৈরি করার সময় আপনি "--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/references/run/#runtime-privilege-and-linux-capables


2
এটি হোস্ট মেশিনে সময় পরিবর্তন করে। একটি লিনাক্স সিস্টেমের সময় বর্তমানে নামগতির নয়, হোস্ট এবং সমস্ত পাত্রে কেবলমাত্র একটি মান রয়েছে।
বিএমচ

হ্যাঁ আপনি ঠিক. এটি হোস্ট মেশিন ঘড়ির সময় পরিবর্তন করে। কেবলমাত্র প্রশ্নটি পুনরায় পড়ুন এবং হোস্ট মেশিনের ঘড়িটি পরিবর্তন না করার বিষয়ে স্পষ্টভাবে উল্লেখ করা প্রশ্নটি উপলব্ধি করে। আমি সংশোধন করেছি :)
ওলেগ কাজাকভ

0

অতিরিক্ত পরিবেশ পরিবর্তনশীল সহ ধারকটি শুরু করুন:

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

আমি সময়কে গতিশীলভাবে সেট করার জন্য একটি উপায় খুঁজছি, যার অর্থ এটি রানটাইমে সেট করা যেতে পারে। আমি আমার প্রশ্ন আপডেট করেছি।
ভিংটোফ্ট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.