ডকার কনটেইনার সময় এবং সময় অঞ্চল (পরিবর্তনগুলি প্রতিফলিত করবে না)


135

ডকার পাত্রে তাদের সময় তথ্য কোথায় পাওয়া যায়? আমি বেসিক উবুন্টু থেকে কিছু ধারক তৈরি করেছি: বিশ্বাসযোগ্য চিত্র, এবং যখন আমি এটি চালনা করি এবং 'তারিখ' অনুরোধ করি, আমি ইউটিসি সময় পাই।

কিছুক্ষণের জন্য আমি আমার ডকফাইফিলে নিম্নলিখিতটি করে এটির কাছাকাছি পৌঁছেছি:

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

তবে কোনও কারণে যে কাজ বন্ধ করে দিয়েছে। অনলাইন অনুসন্ধানে আমি নীচের প্রস্তাবিত দেখেছি:

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

এই দুটি পদ্ধতিই টাইমজোনটি সঠিকভাবে সেট করেছে!

$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015

কেউ কি জানে কী দেয়?


3
আপনি যদি ব্যবহার করেন তবে আপনাকে প্রথমে Alpineইনস্টল করতে হবে tzdata, এখানে github.com/gliderlabs/docker-alpine/issues/136 দেখুন
বেল্টার

1
এফওয়াইআই । । আমি ডকার বিল্ড / ডকফাইফিল সময়ে নয় ডকার রান টাইমে ধারকটির সময় অঞ্চল নির্ধারণ করতে চাই। -v /etc/localtime:/etc/localtime:ro(CentOS) সাজানোর কাজ ব্যবহার করে। ধারক-কমান্ড-লাইনের তারিখের মধ্যে প্রত্যাশিত সময় অঞ্চল বিন্যাসে তারিখ ফেরত আসে। কনটেইনারটিতে চলছে কিন্তু জেনকিনগুলি মনে করে টাইমজোনটি ইউটিসি। কেন? / ইত্যাদি / লোকালটাইমটি নির্মিত পাত্রে ../usr/share/zoneinfo/UTC এর একটি সিমিলিংক। ধারকটিতে ইউটিসি ফাইলের সামগ্রী এখন নতুন টাইমজোন। তবে জেনকিনস (এবং সম্ভবত অন্যান্য জাভা ভিত্তিক সফ্টওয়্যার) সেই সিমিলিংকের নাম ব্যবহার করে যা এখনও "ইউটিসি"। সমাধান অনুসন্ধান করা হচ্ছে। । ।
গাইতে

1
2 টি জিনিস প্রয়োজন, 1. কন্টেইনারটি তৈরি করা হলে / etc / লোকালটাইম সিমিলিংক এবং / ইত্যাদি / টাইমজোন এবং 2 সেট করতে একটি init স্ক্রিপ্ট ব্যবহার করুন জেনকিনের সময় অঞ্চলটি দুটি জাভা বিকল্প থেকে নেওয়া হয়, এই বিকল্পগুলি init স্ক্রিপ্টে পাস করা দরকার যা জেনকিনস প্রক্রিয়া শুরু করে। যেমন "-Dorg.apache.commons.jelly.tags.fmt.timeZone = আমেরিকা / নিউ_ইয়র্ক -ডুজার.টাইমজোন = আমেরিকা / নিউ_ইয়র্ক"। দুঃখিত, এটি জেনকিনস নির্দিষ্ট তবে আশাকরি অন্য কিছু জেনকিন ব্যবহারকারীদের জন্য কার্যকর।
gaoithe

উত্তর:


208

এখানে রহস্যটি হ'ল dpkg-reconfigure tzdataকেবল /etc/localtimeএকটি অনুলিপি, হার্ডলিঙ্ক বা সিমলিংক (একটি সিএমলিংক পছন্দসই) হিসাবে কোনও ফাইলের মধ্যে তৈরি করে /usr/share/zoneinfo। সুতরাং এটি সম্পূর্ণভাবে আপনার ডকস্পাইল থেকে করা সম্ভব। বিবেচনা:

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

এবং একটি বোনাস হিসাবে, টিজেডও ধারকটিতে সঠিকভাবে সেট করা হবে।

এটি বিতরণ-অজোনস্টিকও তাই এটি কোনও লিনাক্সের সাথে কাজ করে।

দ্রষ্টব্য: আপনি যদি কোনও আলপাইন ভিত্তিক চিত্র ব্যবহার করেন তবে আপনাকে tzdataপ্রথমে ইনস্টল করতে হবে । (এই সমস্যাটি এখানে দেখুন )

এটা এমন দেখতে:

RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles

20
টি জেড নামের তালিকা: en.wikipedia.org/wiki/List_of_tz_database_time_zones
BillyTom

5
উবুন্টু সহ: 16.04 (এবং অন্যান্য সংস্করণ হতে পারে) আপনার tzdataএই কাজটি করার জন্য প্যাকেজ ইনস্টল করা দরকার ।
আপস

5
আমি কি কেবলমাত্র যিনি ডকফাইফাইলের টাইমজোন হার্ডকোড করা খুব স্মার্ট না বলে মনে করেন?
ওল্ফগ্যাং

1
@ ওল্ফগ্যাং এটি একটি উদাহরণ। আপনি অন্য কোনো ভাবে আপনি সচরাচর এই ধরনের কমান্ড লাইন, Docker-compose.yml, ইত্যাদি বিভিন্ন পরিবেশের, প্রদান করবে এটা প্রদান করতে পারেন
মাইকেল হ্যাম্পটন

আমি লক্ষ্য করেছি যে, কমপক্ষে আলপাইন ভিত্তিক চিত্রগুলির জন্য, কেবলমাত্র TZভেরিয়েবল সেট করা যথেষ্ট। আমাকে সিমলিঙ্কস বা অন্য কিছু সেটআপ করতে হয়নি।
কোড_ড্রেড

58

সাধারণত এটি ডকের পাত্রে পরিবেশগত পরিবর্তনশীল সেট করা যথেষ্ট:

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

অবশ্যই এটি সঙ্গে কাজ করবে docker-compose


2
এটি সবচেয়ে মার্জিত উপায় বলে মনে হচ্ছে। যত্ন যে কিছু বেস ইমেজ, মত নিন ubuntu:16.04, নেই tzdataপ্যাকেজ যা Dockerfile যোগ করা উচিত নয়।
জুলিয়ান ফাস্ট্রি

1
+1 - আমি জুলিয়েনের সাথে একমত; এটি রানটাইমের সময় অঞ্চল নির্ধারণের জন্য সর্বাধিক মার্জিত পদ্ধতির বলে মনে হচ্ছে। এটি CentOS এর সাথে ভাল কাজ করে। আলপাইন চিত্রটির জন্য 'tzdata' প্যাকেজ ইনস্টল করা দরকার, যা অতিরিক্ত 3MB চিত্রের
পেডলোড

এটি দুর্দান্ত বলে মনে হচ্ছে তবে মনে হচ্ছে এটি আমার পক্ষে কাজ করবে না (CentOS 7.5.1804 এবং tzdata-2018e-3.el7.noarch সহ)? দু: খিত মুখ
গাইতে

22

/etc/localtimeচিত্রটিতে মাউন্ট করা, তাই এটি host -vসর্বাধিক জনপ্রিয়তার সাথে সিঙ্ক হয় ।

তবে সমস্যাটি দেখুন 12084 :

এটি সঠিক নয় কারণ সফ্টওয়্যারটির পরিবর্তে ফাইল /etc/timezoneসেট করার প্রয়োজন হলে এটি কাজ করে না ।
আপনি যেভাবে ব্যবহার করছেন এটি এটিকে ডিফল্ট মান হিসাবে রেখে দেয় etc/UTC

আমি নির্ধারণ করেছি যে প্রকৃতপক্ষে কোনও ডকারের ধারকটির ভিতরে সময় অঞ্চল নির্ধারণের জন্য কোনও মূর্খতাপূর্ণ মার্জিত উপায় নেই।
সুতরাং অবশেষে এই সমাধানে স্থির হয়েছে:

অ্যাপ ডকফায়াইল:

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

অ্যাপ এন্ট্রিপয়েন্ট স্ক্রিপ্ট:

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

/configনির্দিষ্ট দেশ বা অঞ্চলে স্থানীয় ভোজ্য ডেটা ভলিউম ডকফায়াইল:

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

... এটি মার্জিত নয় কারণ 3 টি পৃথক ফাইল জড়িত রয়েছে এবং /etc/localtimeপ্রতিটি রানটাইম ধারক শুরুতে পুনরায় তৈরি করা হয়। যা বরং অপব্যয়ী।

তবে এটি সঠিকভাবে কাজ করে এবং সফলভাবে বেস অ্যাপ্লিকেশন চিত্র এবং প্রতিটি দেশ-বিদেশী স্থানীয় কনফিগারেশনের মধ্যে বিচ্ছেদ অর্জন করে।
কোড 3 লাইন।


1
আমার জন্য, এটি ছিল: RUN echo "Europe/London" > /etc/timezone
জ্যাম্পোটিন

@ জ্যাম্পোটিন এতটা সার্ভারফল্ট / এ / 856593/783 তেমন কি তবে?
ভনসি

18

আপনি আপনার স্থানীয় ফাইলগুলি (/ ইত্যাদি / টাইমজোন এবং / ইত্যাদি / স্থানীয় সময়) আপনার ডকার-ধারকটিতে ভলিউম হিসাবে যুক্ত করতে পারেন।

docker-compose.ymlনিম্নলিখিত লাইন দিয়ে আপনার আপডেট করুন ।

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

এখন ধারক সময়টি আপনার হোস্টের মতোই


আপনার সেন্টস বিতরণ হোস্ট echo "Europe/Paris" > /etc/timezoneকনটেইনারটি পুনরায় চালু করার আগে কমান্ডটি প্রবেশ করুন ।
ক্রেজিম্যাক্স

এটি ম্যাকওএস হোস্টে কাজ করে?
রেডসান্দ্রো

ম্যাকে কাজ করে না
মার্সেলো ডি বিক্রয়

এটি ম্যাকোজে কাজ করত তবে আমি দীর্ঘ সময় পরে আবার এটি চেষ্টা করেছিলাম এবং আমি নিম্নলিখিতটি পাই। হাই সিয়েরা বা ডকার পরিবর্তনের কারণে এটি নিশ্চিত নয়: "ডকার: ডেমোন থেকে ত্রুটি প্রতিক্রিয়া: মাউন্টগুলি অস্বীকার করা হয়েছে: পথ / ইত্যাদি / লোকালটাইম ওএস এক্স থেকে ভাগ করা হয়নি এবং ডকারের কাছে জানা নেই You আপনি ডকারের থেকে ভাগ করা পথগুলি কনফিগার করতে পারেন - > পছন্দসমূহ ... -> ফাইল ভাগ করে নেওয়া more
gae123

1
এটি আপনার জোনিনফো ডিবি কে দুর্নীতিগ্রস্ত করবে কারণ / ইত্যাদি / লোকালটাইম একটি সিমিলিংক (এইভাবে / usr / শেয়ার / জোনিনফো / কিছু / থিংকটি ধারকটির ভিতরে / usr / শেয়ার / জোনিনফো / ইউটিসি হিসাবে সজ্জিত হওয়ার সম্ভাবনা রয়েছে)। আপনি কনটেইনারটির সাথে হোস্টের থেকে ডিবি ফাইলটি মিশ্রিত করবেন তা উল্লেখ করার দরকার নেই।
আয়নেলম্যাক

12

উবুন্টু 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

1
সিরিয়াসলি ... এটিই একমাত্র সমাধান যা কাজ করেছিল!
জেরাত

1
এছাড়াও এটি করতে হয়েছিল - মনে হয় tzdata আর কোনও ডিফল্টে ডিফল্টর মধ্যে নেই।
পিটার

4

যদি আপনি এর উপর ভিত্তি করে ডকার চিত্র ব্যবহার করছেন ubuntu:

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date

3

তথ্য এবং ইস্যুটির লিঙ্কের জন্য ভনকে ধন্যবাদ। এটি যেমন একটি বিভ্রান্তিকর জগাখিচুড়ি মনে হচ্ছে, তাই আমি কীভাবে এটি সমাধান করব সে সম্পর্কে নিজের ধারণার উপর কিছু পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে।

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

(আমার টাইমজোন নির্বাচন করার জন্য অনুরোধগুলি অনুসরণ করুন)

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

তারপরে আমি এর প্রতিফলিত করতে আমার ডকফিলিগুলি আপডেট করেছি:

FROM chocko/ubuntu:local

এটিকে অবশ্যই কিছু ভুল হতে হবে কারণ এটি উপেক্ষা করা খুব সহজ বলে মনে হচ্ছে ... বা এটি গ্রহণযোগ্য?


এটি আমিও চেষ্টা করেছি, তবে আমার ধারকটির পরেও সময় অঞ্চলটি নিজেকে পুনরায় সেট করে exit। এটি দেবিয়ান উপর
মাইক চেম্বারলাইন

@ মাইকচেম্বারলাইন আপনি কি উপরে মাইকেল হ্যাম্পটনের গৃহীত উত্তরটি চেষ্টা করে দেখেছেন? আমি নিজে এটি বাস্তবায়ন করি নি, তবে আমি এটি বিবেচনা করেছি যে এটি প্রাপ্ত উর্ধ্বেগুলি বিবেচনা করার উপায়।
চকোমোনকি

2

আমার দুটি সেন্ট এখানে যুক্ত করা হচ্ছে, কারণ আমি এর মধ্যে বেশ কয়েকটি চেষ্টা করেছি তবে কোনওটিই আলপাইন ভিত্তিক চিত্রগুলিতে কাজ করেনি।

তবে, এটি কৌশলটি করেছে:

ENV TZ=America/Toronto
RUN apk update
RUN apk upgrade
RUN apk add ca-certificates && update-ca-certificates
RUN apk add --update tzdata
RUN rm -rf /var/cache/apk/*

[ উত্স ]


1

docker runআর্গুমেন্টে সময় অঞ্চল নির্ধারণের আরও সাধারণ উপায় :

-e TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

অথবা পুনঃব্যবহারের জন্য:

function GET_TZ () {
    ls -la /etc/localtime | cut -d/ -f8-9
}

...
-e TZ=`GET_TZ`

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