Откуда контейнеры Docker получают информацию о своем времени? Я создал несколько контейнеров из базового образа ubuntu:trusted, и когда я запускаю его и запрашиваю "дату", я получаю время UTC.
Некоторое время я обходил это, выполняя следующие действия в моем файле Dockerfile:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
Однако по какой-то причине это перестало работать. Поискав в Интернете, я увидел следующее предложение:
docker run -v /etc/timezone:/etc/timezone [image-name]
Однако оба этих метода правильно устанавливают часовой пояс!
$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015
Секрет здесь в том, что dpkg-reconfigure tzdata просто создает /etc/localtime как копия, жесткая ссылка или символическая ссылка (предпочтительна символическая ссылка) на файл в /usr/share/zoneinfo. Таким образом, это можно сделать полностью из вашего файла Dockerfile. Считать:
это неверно, потому что оно не работает, когда программное обеспечение требует вместо этого файл /etc/timezone быть установленным. Тот способ, который вы используете, оставляет его в качестве значения по умолчанию etc/UTC.
Я определил, что на самом деле не существует надежного элегантного способа установить часовой пояс внутри контейнера docker. Итак, мы наконец остановились на этом решении:
# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata
Объем данных /config dockerfile, локализованный для определенной страны или региона:
# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone
... это не элегантно, потому что включает в себя 3 отдельных файла и повторное создание /etc/localtime при каждом запуске контейнера среды выполнения. Что довольно расточительно.
Однако он работает должным образом и успешно обеспечивает разделение между базовым образом приложения и каждой локализованной конфигурацией для каждой страны. В 3 строках кода.
Спасибо VonC за информацию и ссылку на проблему. Это кажется таким запутанным беспорядком, поэтому я провел некоторое тестирование своей собственной идеи о том, как решить эту проблему, и, похоже, она отлично работает.
>docker run -it ubuntu:trusty /bin/bash#dpkg-reconfigure tzdata
(следуйте инструкциям, чтобы выбрать мой часовой пояс)
>docker commit [container-id] chocko/ubuntu:local
Затем я обновил свои файлы Dockerfiles, чтобы отразить это:
FROM chocko/ubuntu:local
Должно быть, в этом что-то не так, потому что кажется, что это слишком легко упустить из виду... Или это приемлемо?
К вашему сведению … я хочу установить часовой пояс контейнера во время выполнения docker, а не во время сборки docker / dockerfile. Использование -v /etc/localtime:/etc/localtime:ro (CentOS) вроде как работает. Внутренняя дата командной строки контейнера возвращает дату в ожидаемом формате часового пояса. НО дженкинс, работающий в контейнере, считает, что часовой пояс - UTC. Почему? /etc/localtime - это символическая ссылка на …/usr/share/zoneinfo/UTC во встроенном контейнере. Содержимое файла UTC в контейнере теперь является новым часовым поясом. Но дженкинс (и, возможно, другое программное обеспечение на базе java) использует имя символической ссылки, которое по-прежнему является “UTC”. В поисках решения. . .
Нужны 2 вещи: 1. при создании контейнера используйте сценарий инициализации для установки символической ссылки /etc/localtime и /etc/timezone и 2. поскольку часовой пояс дженкинса берется из двух параметров java, эти параметры необходимо передать сценарию инициализации, который запускает процесс дженкинса. например " -Dorg.apache.commons.jelly.tags.fmt.Часовой пояс=Америка/Нью_Йорк -Duser.часовой пояс=Америка/Нью_Йорк ". Прошу прощения, это специфично для Дженкинса, но, надеюсь, полезно для некоторых других пользователей Дженкинса.