Где контейнеры Докера получают свою информацию времени? Я создал некоторые контейнеры из основного изображения ubuntu:trusty, и когда я выполняю его и запрашиваю 'дату', я получаю время 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
Кто-либо знает то, что дает?
Секрет в том, что dpkg-реконфигурирует tzdata
просто создает /etc/localtime
как копию, жесткую ссылку или сим-ссылку (предпочтительнее сим-ссылку) к файлу в /usr/share/zoneinfo
. Таким образом, это можно сделать полностью из вашего Докер-файла. Рассмотрим:
ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
И в качестве бонуса, TZ также будет правильно установлен в контейнере.
Это также дистрибутив-диагностика, так что он работает практически с любым Linux.
Примечание: если вы используете образ на основе alpine, вам нужно сначала установить tzdata
. (смотрите этот выпуск здесь)
Похоже на то:
RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles
Спасибо VonC за информацию и ссылку на выпуск. Это похоже на такой запутанный беспорядок, поэтому я провел небольшое тестирование на собственной идее, как это решить, и кажется, что это отлично работает.
>docker run -it ubuntu:trusty /bin/bash
#dpkg-reconfigure tzdata
(следуйте подсказкам, чтобы выбрать мой часовой пояс)
>docker commit [container-id] chocko/ubuntu:local
Затем я обновил свои Докерфайлы, чтобы отразить это:
FROM chocko/ubuntu:local
Должно быть что-то не так, потому что это кажется слишком простым, чтобы быть пропущенным.... Или это приемлемо?
Установка /etc/localtime
на изображении, поэтому оно синхронизировано с хостом -v
является самым популярным.
Но смотрите выпуск 12084:
это неправильно, потому что не работает, когда программное обеспечение требует вместо него установить файл
/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/
App entrypoint script:
# Set timezone as specified in /config/etc/timezone
dpkg-reconfigure -f noninteractive tzdata
Data volume
/config
dockerfile, localized to a specific country or region:
# Set the time zone
RUN echo "Europe/London" > /config/etc/timezone
... это не элегантно, потому что включает 3 отдельных файла и воссоздает
/etc/localtime
при каждом запуске контейнера времени исполнения. Что довольно расточительно.Однако, он работает правильно, и успешно достигает разделения между базовым образом приложения и каждой локализованной конфигурацией для каждой страны.
. В 3 строках кода.
, если вы используете образ докера на основе ubuntu
:
# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date
Обычно достаточно установить переменную среды в контейнере докера, например так:
docker run -e TZ=Europe/Amsterdam debian:jessie date
Конечно, это также будет работать с docker-compose
.
Вы можете добавить свой локальные файлы (/ etc / timezone и / etc / localtime) в качестве тома в вашем docker-контейнере.
Обновите свой docker-compose.yml
следующими строками.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Теперь время контейнера установлено то же, что и на вашем хосте
В образе 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
Добавляю сюда свои два цента, потому что я пробовал несколько из них, но ни один из них не работал с изображениями альпийских гор.
Однако это помогло:
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/*
[ Источник ]
Более общий способ установки часового пояса в docker run
arguments:
-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`
В базовом образе alpine (пример использования node:10.16.0-alpine):
Dockerfile
FROM node:10.16.0-alpine
ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm i --production
COPY . .
CMD node index.js
Использование контейнера Fedora (вероятно, будет работать и с Ubuntu):
Самым простым решением, которое я нашел, было использование следующего в docker-compose.yml
environment:
TZ: "${TZ:-America/Los_Angeles}"
Затем в вашем .env файл (который автоматически считывается docker-compose)
TZ=America/Los_Angeles
Это позволяет вам поставить docker-compose.yml под контроль версий и использовать настроенный файл .env, который может игнорироваться git.
Вы получаете значение по умолчанию для контейнера, и вы получаете возможность настройки, лучшее из обоих миров.
Для Fedora никаких других изменений не потребовалось, она просто работает!