שאלה Docker זמן ואזור זמן של Docker (לא ישקף שינויים)


איפה מיכלי 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 כמו עותק, hardlink או קישור (קישור מועדף) לקובץ ב /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
עם אובונטו: 16.04 (ואולי גרסה אחרת) אתה צריך tzdata חבילה מותקנת עבור עבודה זו. - Opsse
האם אני היחיד שחושב שזה לא חכם מאוד hardcode קוד זמנים ב Dockerfile? - Wolfgang
@Wolfgang זוהי דוגמה. אתה יכול לספק את זה בכל דרך אחרת היית בדרך כלל לספק משתני סביבה, כגון שורת הפקודה, docker-compose.ym, וכו ' - 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. התמונה Alpine דורשת התקנה של חבילת "tzdata", אשר העדיף על פני תצורות hrcoding בזמן לבנות אלא אם כן תוספת 3MB התמונה מטען לא יכול להיות נסבל :) - Frelling


הרכבה /etc/localtime בתמונה, כך שזה מסונכרן עם host -v הוא אחד הפופולריים ביותר.

אבל תראה גליון 12084You

זה לא נכון כי זה לא עובד כאשר התוכנה דורשת במקום את הקובץ /etc/timezone להיות מוכן.
  בדרך זו אתה משאיר את זה כערך ברירת המחדל etc/UTC.

יש לי לקבוע כי למעשה אין דרך אלגנטית גמיש להגדיר את אזור הזמן בתוך מיכל מעגן.
  אז סוף סוף התיישבו על פתרון זה:

App 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.

עדכן את docker-compose.yml עם השורות הבאות.

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

עכשיו זמן המיכל הוא זהה על המארח שלך


10
2018-06-08 15:55



אם המארח שלך ב- CentOS distrib מזין את הפקודה echo "Europe/Paris" > /etc/timezone לפני הפעלה מחדש של המכולה. - CrazyMax
האם זה עובד על המארח MacOS? - Redsandro
לא עובד MAC - Marcello de Sales
זה עבד על MacOS אבל אני פשוט ניסיתי את זה שוב אחרי הרבה זמן ואני מקבל את הדברים הבאים. לא בטוח אם High Sierra או שינוי מעגן גרמו לכך: "docker: תגובת שגיאה מאת daemon: Mounts נדחתה: הנתיב / etc / localtime אינו משותף מ- OS X ולא ידוע ל- Docker. באפשרותך להגדיר נתיבים משותפים מ- Docker - > העדפות ... -> שיתוף קבצים docs.docker.com/docker-for-mac/osxfs/#namespaces למידע נוסף." - gae123
זה יהיה מושחת שלך db zoneinfo כמו / etc / localtime הוא סמל (ולכן / usr / share / zoneinfo / חלק / הדבר צפוי לקבל רכוב כמו / usr / share / zoneinfo / UTC בתוך המיכל). שלא לדבר על זה היית מערבב את הקובץ db מן המארח עם אחד במיכל. - ionelmc


בתמונת אובונטו 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 הוא כבר לא כמה distros כברירת מחדל. - Peter


אם אתה משתמש תמונה מעגן מבוסס על ubuntu You

# 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 האם קרה לך לנסות את התשובה המקובלת על ידי מייקל Hampton לעיל? אני לא יישמתי את זה בעצמי, אבל אני חושב שזה הדרך ללכת בהתחשב upvotes כי הוא קיבל. - 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





דרך כללית יותר להגדיר את אזור הזמן 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`

0
2017-08-08 09:03