Как добавить локаль 866 в контейнер opensuse/tumbleweed?

У меня возникла проблема с добавлением 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 в этом контейнере. Что именно может вызывать проблемы на этом этапе?
  • 4 февраля 2025 г. 15:54
Ответы на вопрос 2
Добавление локали 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
Похожие вопросы