سؤال عامل وقت ووقت حاوية عامل الميناء (لن يعكس التغييرات)


من أين تحصل حاويات Docker على معلومات وقتها؟ لقد قمت بإنشاء بعض الحاويات من أوبونتو الأساسية: صورة مضمونة ، وعندما أقوم بتشغيلها وطلب "تاريخ" ، أحصل على وقت UTC.

للحظة حصلت على هذا عن طريق القيام بما يلي في Dockerfile:

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

أي شخص يعرف ما يعطي؟


76
2018-04-14 23:49


الأصل


إذا كنت تستخدم Alpine، تحتاج إلى تثبيت tzdata أولا ، انظر هنا github.com/gliderlabs/docker-alpine/issues/136 - Belter


الأجوبة:


السر هنا هو ذلك dpkg-reconfigure tzdata يخلق ببساطة /etc/localtime كنسخة أو رابط تشعبي أو رابط رمزي (يُفضل ارتباطًا رمزيًا) إلى ملف في /usr/share/zoneinfo. لذلك من الممكن القيام بذلك بالكامل من Dockerfile الخاص بك. يعتبر:

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

وكمكافأة ، سيتم ضبط TZ بشكل صحيح في الحاوية أيضًا.

هذا هو أيضا توحيد التوزيع ، لذلك يعمل مع أي لينكس إلى حد كبير.

ملاحظة: إذا كنت تستخدم صورة تستند إلى جبال الألب يجب عليك تثبيت tzdata أول. (انظر هذه القضية هنا)

يشبه هذا:

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

127
2018-04-17 19:55



قائمة بأسماء TZ: en.wikipedia.org/wiki/List_of_tz_database_time_zones - BillyTom
مع Ubuntu: 16.04 (وربما الإصدار الآخر) تحتاج إلى tzdata الحزمة المثبتة لجعل هذا العمل. - Opsse
هل أنا الوحيد الذي يعتقد أنه ليس من الذكاء أن يقوم بترميز المنطقة الزمنية في Dockerfile؟ - Wolfgang
Wolfgang هذا مثال. يمكنك توفيرها بأي طريقة أخرى توفر عادةً متغيرات البيئة ، مثل سطر الأوامر ، docker-compose.yml ، إلخ. - Michael Hampton♦


عادة ما يكون كافياً لتعيين متغير بيئة في حاوية عامل الميناء ، مثل:

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

بالطبع هذا من شأنه أن يعمل أيضا مع docker-compose.


32
2018-01-13 22:15



يبدو أن هذا هو الطريقة الأكثر أناقة. الحرص على أن بعض الصور الأساسية ، مثل ubuntu:16.04لا يملك tzdata الحزمة التي ينبغي إضافتها في Dockerfile. - Julien Fastré
+1 - أنا أتفق مع جوليان. يبدو أن هذا هو الأسلوب الأكثر أناقة لتحديد المناطق الزمنية في وقت التشغيل. هذا يعمل بشكل جيد مع CentOS. تتطلب صورة جبال الألب تركيب حزمة "tzdata" ، والتي تكون مفضلة على تكوينات كود التعريف في وقت البناء ما لم يكن من الممكن تحمل حمولة الصورة الإضافية 3 ميجابايت :) - Frelling


متزايد /etc/localtime في الصورة ، لذا فهي متزامنة مع host -v هو الأكثر شعبية.

ولكن انظر العدد 12084:

هذا غير صحيح لأنه لا يعمل عندما يتطلب البرنامج بدلاً من ذلك الملف /etc/timezone للتهيئة.
  بهذه الطريقة التي تستخدمها تتركها كقيمة افتراضية etc/UTC.

لقد قررت أنه في الواقع لا توجد طريقة أنيقة مضمونة لتعيين المنطقة الزمنية داخل حاوية عامل ميناء.
  لذلك استقرت في النهاية على هذا الحل:

التطبيق dockerfile:

# 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 dockerfile ، مترجمة إلى بلد أو منطقة معينة:

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

... إنها ليست أنيقة لأنها تتضمن 3 ملفات منفصلة ، وإعادة إنشائها /etc/localtime على كل حاوية بداية التشغيل. وهو إسراف بدلاً من ذلك.

ومع ذلك ، فإنه يعمل بشكل صحيح ، ويحقق بنجاح الفصل بين صورة التطبيق الأساسية ، وكل تهيئة محلية لكل بلد.
  في 3 سطور من الكود.


16
2018-04-15 06:14



بالنسبة لي ، كان: RUN echo "Europe/London" > /etc/timezone - jpmottin
jpmottin حتى قليلا في serverfault.com/a/856593/783 ثم؟ - VonC


يمكنك إضافة ملفاتك المحلية (/ etc / timezone و / etc / localtime) كحجم في حاوية عامل الميناء.

تحديث الخاص بك docker-compose.yml مع الخطوط التالية.

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

الآن ، يكون وقت الحاوية هو نفسه الموجود في مضيفك


10
2018-06-08 15:55



إذا كان مضيف توزيعة CentOS الخاص بك أدخل الأمر echo "Europe/Paris" > /etc/timezone قبل إعادة تشغيل الحاوية. - CrazyMax
هل يعمل هذا على مضيف MacOS؟ - Redsandro
لا يعمل في MAC - Marcello de Sales
هذا يستخدم للعمل على MacOS لكني حاولت فقط مرة أخرى بعد وقت طويل واحصل على ما يلي. لست متأكدًا مما إذا كان تغيير High Sierra أو عامل ميناء قد تسبب في حدوث ذلك: "docker: استجابة خطأ من البرنامج الخفي: تم الحذف: لا يتم مشاركة المسار / etc / localtime من OS X ولا يعرف Docker. يمكنك تهيئة المسارات المشتركة من Docker - > التفضيلات ... -> مشاركة الملفات docs.docker.com/docker-for-mac/osxfs/#namespaces لمزيد من المعلومات." - gae123
سيؤدي ذلك إلى إفساد المنطقة الطرفية الخاصة بك مثل / etc / localtime وهي عبارة عن ارتباط رمزي (وبالتالي فإن usr / share / zoneinfo / Some / Thing من المحتمل أن يتم تحميله على هيئة حاوية / usr / share / zoneinfo / UTC داخل الحاوية). ناهيك عن مزج ملف ديسيبل من المضيف مع واحد في الحاوية. - ionelmc


في ubuntu 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

8
2018-06-19 10:12



على محمل الجد ... هذا هو الحل الوحيد الذي يعمل! - Gerrat
كان أيضا للقيام بذلك - يبدو أن tzdata لم يعد في بعض التوزيعات افتراضيا. - Peter


إذا كنت تستخدم صورة عامل الميناء على أساس ubuntu :

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

3
2017-07-16 03:37





بفضل VonC للحصول على معلومات وربط لهذه القضية. يبدو هذا مثل هذه الفوضى المعقدة ، لذلك أجريت بعض الاختبارات على فكرتي الخاصة حول كيفية حل هذه المشكلة ويبدو أنها تعمل بشكل رائع.

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

(اتبع المطالبات لتحديد المنطقة الزمنية الخاصة بي)

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

ثم قمت بتحديث Dockerfiles لي لعكس هذا:

FROM chocko/ubuntu:local

يجب أن يكون هناك شيء خاطئ في هذا لأنه يبدو من السهل جدا التغاضي عنه ... أم هل هذا مقبول؟


2
2018-04-15 19:10



هذا أيضًا ما حاولت ، ولكن المنطقة الزمنية ما يزال يعيد ضبط نفسه بعد exit الحاوية. هذا على ديبيان. - Mike Chamberlain
MikeChamberlain لم يحدث في محاولة الإجابة المقبولة من قبل مايكل هامبتون أعلاه؟ لم أقم بتنفيذه بنفسي ، لكني أعتقد أنه السبيل للذهاب للنظر في الأصوات التي تلقتها. - Chockomonkey


مضيفا سنتي هنا ، لأنني حاولت العديد من هذه ولكن لا شيء يعمل على الصور التي تعتمد على جبال الألب.

ومع ذلك ، هذا لم الحيلة:

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
2018-04-25 01:05