У меня возникла проблема с добавлением 866 локали в контейнер, основанный на opensuse/tumbleweed:latest. В начальном состоянии у меня установлен минимальный набор локалей, как показано ниже: ``` tumbleweed:~ # locale -a C C.utf8 POSIX en_US.utf8 tumbleweed:~ # localedef --help ... System's directory for character maps : /usr/share/i18n/charmaps repertoire maps: /usr/share/i18n/repertoiremaps locale path : /usr/lib/locale:/usr/share/i18n tumbleweed:~ # ll /usr/lib/locale total 8 drwxr-xr-x 3 root root 4096 Jan 22 02:27 C.utf8 drwxr-xr-x 3 root root 4096 Jan 22 02:27 en_US.utf8 tumbleweed:~ # ll /usr/share/i18n ls: cannot access '/usr/share/i18n': No such file or directory ``` Создатели контейнера указали, что они удалили все ненужные компоненты, и посоветовали установить пакет glibc-locale. Я это сделал: ``` zypper install -y glibc-locale tumbleweed:~ # ll /usr/lib/locale | grep ru drwxr-xr-x 3 root root 4096 Feb 4 18:06 ru_RU drwxr-xr-x 3 root root 4096 Feb 4 18:06 ru_RU.koi8r drwxr-xr-x 3 root root 4096 Feb 4 18:06 ru_RU.utf8 drwxr-xr-x 3 root root 4096 Feb 4 18:06 ru_UA drwxr-xr-x 3 root root 4096 Feb 4 18:06 ru_UA.utf8 tumbleweed:~ # cat /usr/lib/locale/ru_RU/LC_NAME $345678%d%t%g%t%m%t%f ISO-8859-5 ``` Однако в glibc-locale не оказалось 866 локали. После этого я добавил пакет i18n, где нашел IBM866, и успешно его скомпилировал (не учитывая некоторые предупреждения о mr/mrs), так как на полном Tumbleweed эти же предупреждения присутствуют. ``` zypper install -y glibc-i18ndata tumbleweed:~ # ll /usr/share/i18n/charmaps | grep 866 -rw-r--r-- 1 root root 2682 Jan 20 16:33 IBM866.gz -rw-r--r-- 1 root root 2864 Jan 20 16:33 IBM866NAV.gz tumbleweed:~ # localedef -f IBM866 -i r ``` Теперь я пытаюсь понять, как правильно добавить или использовать локаль 866 в этом контейнере. Что именно может вызывать проблемы на этом этапе?
Добавление локали IBM866 в контейнер на основе openSUSE Tumbleweed требует выполнения нескольких шагов. Из того, что вы уже сделали, похоже, что вы на правильном пути. Однако, чтобы добиться успеха в добавлении локали, вам нужно убедиться, что все необходимые компоненты установлены и правильно настроены. Вот шаги, которые помогут вам установить локаль IBM866: 1. **Убедитесь, что необходимые пакеты установлены**: Вы уже установили `glibc-locale` и `glibc-i18ndata`, что совершенно правильно. Также убедитесь, что у вас установлен пакет `locales`, если он доступен. 2. **Создайте локаль IBM866**: После установки необходимых пакетов вам нужно использовать `localedef`, чтобы создать локаль. Убедитесь, что вы вызываете `localedef` с правильными параметрами. Команда ниже должна сработать: ```bash localedef -f IBM866 -i ru_RU ru_RU.IBM866 ``` Эта команда создаст локаль `ru_RU.IBM866`, используя кодировку IBM866 для русской локали. 3. **Проверьте, создана ли локаль**: После выполнения команды проверьте, доступна ли новая локаль: ```bash locale -a | grep IBM866 ``` Вы должны увидеть `ru_RU.IBM866` в выводе. 4. **Настройка системных переменных окружения**: Чтобы использовать эту локаль, вам нужно установить соответствующие переменные окружения. Например, добавьте в ваш `~/.bashrc` или используйте export: ```bash export LANG=ru_RU.IBM866 export LC_ALL=ru_RU.IBM866 ``` После этого выполните команду `source ~/.bashrc`, чтобы обновить переменные окружения. 5. **Тестирование**: Проверьте, что локаль работает должным образом, запустив команду `locale` и убедившись, что `LANG` и `LC_ALL` установлены в `ru_RU.IBM866`. Вы также можете запустить текстовые приложения, которые поддерживают IBM866, чтобы проверить их функциональность. Если вы столкнетесь с ошибками во время выполнения команд, пожалуйста, сообщите об этом, чтобы можно было диагностировать проблему более конкретно.
Внутри контейнера надо отдельно сгенерировать эту локаль:
localedef -i ru_RU -f IBM866 ru_RU.IBM866
(тут локаль будет названа ru_RU.IBM866, но можно назвать как угодно, в том числе ru_RU.CP866).
Рецепт работает в любом Linux, но в минималистичных образах обычно много чего вырезают для уменьшения размера, поэтому каталог /usr/share/i18n пустой или значительно подчищен. В случае с opensuse нужно доустановить пакет glibc-i18ndata.
Образец Dockerfile:
FROM opensuse/tumbleweed RUN zypper in -y glibc-i18ndata && localedef -i ru_RU -f IBM866 ru_RU.IBM866 ENV LC_ALL=ru_RU.IBM866