Вопрос или проблема
Я испытываю ошибку временной зоны внутри контейнера Docker, использующего базовый образ ubuntu:24.04. Эта проблема не возникает, когда я использую базовый образ ubuntu:22.04. Вот минимальный воспроизводимый пример.
22.04:
docker run -it --mount type=bind,source=/etc/localtime,target=/etc/localtime,readonly --mount type=bind,source=/etc/timezone,target=/etc/timezon,readonly ubuntu:22.04 bash
24.04:
docker run -it --mount type=bind,source=/etc/localtime,target=/etc/localtime,readonly --mount type=bind,source=/etc/timezone,target=/etc/timezon,readonly ubuntu:24.04 bash
Часовой пояс хост-системы: /etc/localtime является символической ссылкой на /usr/share/zoneinfo/America/Chicago. Контейнер Docker с ubuntu:24.04: /etc/localtime является символической ссылкой на /usr/share/zoneinfo/UTC. Я попытался смонтировать файлы часового пояса хоста в контейнер:
# синхронизация часового пояса с хостом
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
Несмотря на это, часовой пояс внутри контейнера не совпадает с часовым поясом хоста. Функция tzlocal.get_localzone() работает на хосте, но выдает ошибку внутри контейнера:
File "/usr/local/lib/python3.12/dist-packages/tzlocal/unix.py", line 180, in _get_localzone
tzname = _get_localzone_name(_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/dist-packages/tzlocal/unix.py", line 159, in _get_localzone_name
raise zoneinfo.ZoneInfoNotFoundError(message)
zoneinfo._common.ZoneInfoNotFoundError: 'Найдены несколько конфликтующих конфигураций часового пояса:
/etc/timezone: America/Chicago
/etc/localtime is a symlink to: Etc/UTC
Исправьте конфигурацию или установите часовой пояс в переменной окружения TZ.'
Проблема, похоже, специфична для ubuntu:24.04. Как я могу убедиться, что контейнер корректно отражает настройки часового пояса хоста?
Дополнительная информация:
Я предпочитаю не устанавливать явно часовой пояс внутри Dockerfile. Установка tzdata и других зависимостей, похоже, не решает проблему. Буду признателен за любые советы по устранению этого несоответствия! Подозреваю, что Ubuntu 24.04 автоматически перезаписывает символическую ссылку на время UTC (/usr/share/zoneinfo/UTC)
/etc/localtime
должен быть символической ссылкой, но в вашем примере это обычный файл:
$ docker run -it --mount type=bind,source=/etc/localtime,target=/etc/localtime,readonly ubuntu:24.04 bash
root@48ee615ac631:/# ls -l /etc/localtime
-rw-r--r-- 1 nobody nogroup 2298 Dec 3 14:19 /etc/localtime
Вероятно, это причина того, почему Python предполагает, что /etc/localtime
указывает на значение по умолчанию Etc/UTC
.
Ответ или решение
Ситуация, с которой вы столкнулись, связана с различиями в обработке временных зон между базовыми образами Docker для Ubuntu 22.04 и Ubuntu 24.04. Основная причина проблемы заключается в том, как именно каждая версия Ubuntu управляет настройками временной зоны и обработкой файлов /etc/localtime
и /etc/timezone
.
Шаг 1. Причины проблемы
Как вы уже отметили, при запуске контейнера на основе образа ubuntu:24.04
файл /etc/localtime
становится обычным файлом, а не символьной ссылкой на файл временной зоны, который установлен на хосте. Это неправильно интерпретируется Python-библиотеками, ссылающимися на этот файл, что приводит к ошибке zoneinfo.ZoneInfoNotFoundError
.
Шаг 2. Как правильно монтировать временные зоны
Для того чтобы успешно синхронизировать временные зоны контейнера с настройками хоста, убедимся, что вы используете верные команды для монтирования:
docker run -it \
--mount type=bind,source=/etc/localtime,target=/etc/localtime,readonly \
--mount type=bind,source=/etc/timezone,target=/etc/timezone,readonly \
ubuntu:24.04 bash
Обратите внимание, что в команде для ubuntu:24.04
вы неверно написали путь для /etc/timezone
– вы указали target=/etc/timezon
, что может вызывать проблемы.
Шаг 3. Проверка состояния файлов
Запустите контейнер и выполните следующую команду для проверки статуса файлов:
ls -l /etc/localtime
ls -l /etc/timezone
Убедитесь, что /etc/localtime
указывает на символьную ссылку и совпадает с временной зоной вашего хоста. Если это не так, нужно убедиться, что во время монтирования не происходит ошибок.
Шаг 4. Установка пакетов и конфигурация
Если проблема сохраняется, попробуйте установить пакет tzdata
в контейнере перед выполнением кода:
apt update && apt install -y tzdata
Шаг 5. Устранение конфликта временных зон
Если монтирование настроено правильно, но ошибка все еще возникает, рекомендуется установить переменную окружения TZ
внутри контейнера. Это можно сделать, добавив переменную в команду запуска:
docker run -it \
--mount type=bind,source=/etc/localtime,target=/etc/localtime,readonly \
--mount type=bind,source=/etc/timezone,target=/etc/timezone,readonly \
-e TZ=America/Chicago \
ubuntu:24.04 bash
Заключение
Итак, мы разобрали возможные причины ошибки временной зоны в контейнере на основе ubuntu:24.04
. Основное внимание следует уделить правильному монтированию файлов временной зоны, проверке их состояния внутри контейнера и, при необходимости, установке пакета tzdata
. Установка переменной окружения TZ
поможет устранить конфликт временных зон, который приводит к ошибкам в Python.
Если у вас возникнут дополнительные вопросы или потребуется помощь в дальнейшем, не стесняйтесь обращаться за поддержкой.