Вопрос: Docker Container time & timezone (не отражает изменений)


Где контейнеры Docker получают информацию о времени? Я создал несколько контейнеров из основного образа ubuntu: trusty, и когда я запускаю его и запрашиваю «дату», я получаю UTC.

Некоторое время я обошел это, выполнив следующее в моем файле Docker:

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

Кто-нибудь знает, что дает?


68
2018-04-14 23:49


Источник


Если вы используете Alpine, вам необходимо установить tzdata сначала см. здесь github.com/gliderlabs/docker-alpine/issues/136 - Belter


Ответы:


Секрет здесь в том, что dpkg-reconfigure tzdata просто создает /etc/localtime как копия, hardlink или symlink (символьная ссылка предпочтительнее) к файлу в /usr/share/zoneinfo, Таким образом, это можно сделать полностью из вашего файла Docker. Рассматривать:

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

И в качестве бонуса TZ будет правильно установлен в контейнере.

Это также дистрибутив-агностик, поэтому он работает практически со всеми Linux.

Примечание. Если вы используете изображение на основе альпийских изображений, вам необходимо установить tzdata первый. (см. этот вопрос Вот)

Выглядит так:

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

116
2018-04-17 19:55



Список имен TZ: en.wikipedia.org/wiki/List_of_tz_database_time_zones - BillyTom
С Ubuntu: 16.04 (и, возможно, другая версия) вам нужно иметь tzdata пакет, установленный для выполнения этой работы. - Opsse


Обычно достаточно установить переменную среды в контейнере докера, например:

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

Конечно, это будет работать и с docker-compose,


22
2018-01-13 22:15



Кажется, это самый элегантный способ. Позаботьтесь, чтобы какое-то базовое изображение, например ubuntu:16.04, не имеет tzdata пакет, который должен быть добавлен в файл Dockerfile. - Julien Fastré
+1 - Я согласен с Жюльеном; это, по-видимому, самый элегантный подход для настройки часовых поясов во время выполнения. Это хорошо работает с CentOS. Для альпийского изображения требуется установка пакета «tzdata», который предпочтительнее, чем конфигурация harcoding во время сборки, за исключением случаев, когда нельзя использовать дополнительную полезную нагрузку изображения 3 МБ :) - Frelling


монтаж /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 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"

Теперь время контейнера такое же, как на вашем хосте


9
2018-06-08 15:55



Если ваш хост на сервере CentOS введите команду echo "Europe/Paris" > /etc/timezone перед перезапуском контейнера. - CrazyMax
Это работает на сервере MacOS? - Redsandro
Не работает в MAC - Marcello de Sales
Это использовалось для работы с MacOS, но я просто попробовал это снова через долгое время, и я получаю следующее. Не уверен, что изменение High Sierra или докера вызвало это: «docker: Ответ на ошибку от демона: Mounts denied: путь / etc / localtime не используется в OS X и не известен Docker. Вы можете настроить общие пути из Docker - > Настройки ... -> Общий доступ к файлам. docs.docker.com/docker-for-mac/osxfs/#namespaces для получения дополнительной информации." - gae123
Это приведет к повреждению вашего zoneinfo db, поскольку / etc / localtime является символической ссылкой (таким образом, / usr / share / zoneinfo / Some / Thing, скорее всего, будут установлены как / usr / share / zoneinfo / UTC внутри контейнера). Не говоря уже о том, что вы смешали бы файл db с хостом с таковым в контейнере. - 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

6
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 контейнер. Это находится на Debian. - 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





Более общий способ установки часового пояса в 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