#Как проявляется проблема и где искать причину
После смены часового пояса хоста контейнер может продолжать отображать старое местное время: образу не передаётся нужная TZ, отсутствует tzdata либо приложение хранит собственную зону. При этом системное время UTC чаще всего корректное.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Локальная зона образаУ контейнера не задана TZ или нет данных часовых поясов | date показывает UTC при ожидаемой местной зоне | Настроить TZ в поддерживаемом образе |
| Зона приложенияJava, Node.js, MySQL или другое приложение использует отдельные настройки | date корректен, а журнал приложения нет | Исправить зону в конфигурации приложения |
#Пошаговая диагностика и устранение
- 1. Зафиксируйте время хостаНа Linux-хосте в терминале сравните UTC и местную зону, а также установленную зону. В Docker Desktop команды выполняйте в соответствующей виртуальной системе либо проверьте часы операционной системы.
- Только Linux с systemd; timedatectl отсутствует на некоторых системахLinux · Терминал (Bash)КомандаТолько Linux с systemd; timedatectl отсутствует на некоторых системах.
date -u; date; timedatectl status
- 2. Сравните отображение внутри контейнераПроверьте контейнер, заменив ИМЯ; date должен быть доступен в образе. Сравните UTC с UTC на хосте: если UTC совпадает, проблема относится к часовому поясу, а не к ходу часов.
- Не работает в минимальных образах без команды date или в остановленных контейнерахLinux · Терминал (Bash)КомандаНе работает в минимальных образах без команды date или в остановленных контейнерах.
docker exec ИМЯ date -u
- 3. Проверьте локальное время и зонуВыполните date и при поддержке оболочки посмотрите TZ. Если переменная пуста, это не обязательно ошибка: конкретный образ может использовать /etc/localtime.
- Контейнер должен работать; команда не изменяет времяLinux · Терминал (Bash)КомандаКонтейнер должен работать; команда не изменяет время.
docker exec ИМЯ date
- 4. Проверьте образ и документацию приложенияОткройте Dockerfile и документацию базового образа. Для Debian/Ubuntu наличие tzdata и файлы zoneinfo проверяются внутри образа; Alpine без установленной tzdata может не распознавать именованную зону. Не предполагается, что Windows-контейнер поддерживает Linux TZ.
- 5. Задайте зону в тестовой конфигурацииДля приложения Linux, поддерживающего TZ, укажите в Compose environment: TZ: Europe/Tallinn (или собственную зону IANA). На Windows используйте принятый для этой платформы способ, не копируйте TZ механически.
- Пример под services.<ваш сервис>; по необходимости установите tzdata в образТекстПример под services.<ваш сервис>; по необходимости установите tzdata в образ.
environment: TZ: Europe/Tallinn
- 6. Пересоздайте тестовый контейнерПеременные окружения существующего контейнера при обычном рестарте из нового файла не меняются. В тестовом проекте примените изменения с пересозданием сервиса после резервирования данных.
- В каталоге Compose-проекта, только тестовая среда; имя сервиса не имя контейнераLinux · Терминал (Bash)С осторожностьюВ каталоге Compose-проекта, только тестовая среда; имя сервиса не имя контейнера.
docker compose up -d --force-recreate ИМЯ_СЕРВИСАКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Сверьте записи и UTCПовторите date -u/date и тест формирования даты в самом приложении. Нужный результат: UTC не изменился, а местное представление и новые журнальные метки соответствуют заданной зоне. Если нет — изучите отдельную настройку зоны в приложении.
#Как проверить результат
Совпадают UTC и местное представление с ожидаемыми значениями; новые события формируются с правильным смещением.
#Если исправление не помогло
Если расхождение наблюдается только в базе данных, проверьте тип TIMESTAMP/DATETIME и часовой пояс сеанса СУБД отдельно; это другая причина.