Несоответствие часового пояса в контейнере Docker с использованием ubuntu:24.04, но не с ubuntu:22.04

Вопрос или проблема

Я испытываю ошибку временной зоны внутри контейнера 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.

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

Оцените материал
Добавить комментарий

Капча загружается...