У меня возникла проблема с добавлением 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