Время Контейнера докера и часовой пояс (не отразит изменения),

Где контейнеры Докера получают свою информацию времени? Я создал некоторые контейнеры из основного изображения 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

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

141
задан 15 April 2015 в 02:49
11 ответов

Секрет в том, что 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
217
ответ дан 28 November 2019 в 19:17

Спасибо VonC за информацию и ссылку на выпуск. Это похоже на такой запутанный беспорядок, поэтому я провел небольшое тестирование на собственной идее, как это решить, и кажется, что это отлично работает.

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

(следуйте подсказкам, чтобы выбрать мой часовой пояс)

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

Затем я обновил свои Докерфайлы, чтобы отразить это:

FROM chocko/ubuntu:local

Должно быть что-то не так, потому что это кажется слишком простым, чтобы быть пропущенным.... Или это приемлемо?

3
ответ дан 28 November 2019 в 19:17

Установка /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 строках кода.

22
ответ дан 28 November 2019 в 19:17

, если вы используете образ докера на основе ubuntu :

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date
4
ответ дан 28 November 2019 в 19:17

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

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

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

59
ответ дан 28 November 2019 в 19:17

Вы можете добавить свой локальные файлы (/ etc / timezone и / etc / localtime) в качестве тома в вашем docker-контейнере.

Обновите свой docker-compose.yml следующими строками.

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

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

21
ответ дан 28 November 2019 в 19:17

В образе 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
12
ответ дан 28 November 2019 в 19:17

Добавляю сюда свои два цента, потому что я пробовал несколько из них, но ни один из них не работал с изображениями альпийских гор.

Однако это помогло:

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/*

[ Источник ]

3
ответ дан 28 November 2019 в 19:17

Более общий способ установки часового пояса в 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`
1
ответ дан 28 November 2019 в 19:17

В базовом образе 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

4
ответ дан 29 May 2020 в 03:00

Использование контейнера Fedora (вероятно, будет работать и с Ubuntu):

Самым простым решением, которое я нашел, было использование следующего в docker-compose.yml

environment: 
  TZ: "${TZ:-America/Los_Angeles}"

Затем в вашем .env файл (который автоматически считывается docker-compose)

TZ=America/Los_Angeles

Это позволяет вам поставить docker-compose.yml под контроль версий и использовать настроенный файл .env, который может игнорироваться git.

Вы получаете значение по умолчанию для контейнера, и вы получаете возможность настройки, лучшее из обоих миров.

Для Fedora никаких других изменений не потребовалось, она просто работает!

3
ответ дан 6 May 2021 в 07:26

Теги

Похожие вопросы