Как установить локаль внутри контейнера Ubuntu Docker?

63

Я запускаю контейнер Ubuntu Docker. У меня есть норвежская клавиатура и вам нужно использовать норвежских персонажей (øæå).

Кодирование символов My Terminal настроено на UTF-8, и я подключен к своему контейнеру с использованием SSH. Тем не менее, я не могу напечатать норвежских символов, не копировать и вставлять норвежские символы, а также использовать CTL + SHIFT + U + 00f8.

Я пробовал:

locale-gen nb_NO.UTF-8

но ничего не изменилось. Как установить языковой стандарт и клавиатуру внутри контейнера Docker?

Теги:
docker

9 ответов

90
Лучший ответ

Поместите в свой файл Dockerfile что-то, адаптированное из

# Set the locale
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8     

это извлекается из очень хорошего поста на этом предмете, от

http://jaredmarkell.com/docker-and-locales/

  • 1
    Не работает, когда вы используете debian: jessie в качестве базового контейнера
  • 0
    в этом случае см. ответ Микселя
Показать ещё 8 комментариев
64

Те, кто использует Debian, также должны установить пакет locales.

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales

RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=en_US.UTF-8

ENV LANG en_US.UTF-8 

Этот ответ мне очень помог.

  • 1
    Я не думаю, что вам нужна команда echo ... > /etc/default/locale ; update-locale делает то же самое.
31

Просто добавьте

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

в ваш файл Docker. Для основной операции больше ничего не требуется. Между тем, locale-gen не принимает никаких аргументов, поэтому ни одна из "исправлений, использующих его не работает".

  • 1
    У меня не работал образ Ubuntu. Этот ответ работал, хотя.
  • 1
    Не могли бы вы дать какие-либо подробности? C.UTF-8 доступен на все системы без необходимости устанавливать что - либо, и это должно быть достаточно в основном.
16

На самом деле я столкнулся с одной и той же проблемой, но ни один из предоставленных ответов не работает с debian на 100%: последний, даже если они дают хорошие подсказки.

Самое большое различие заключается в том, что вы должны убедиться, что локальные локальные и локали - все установлены, причем последние уже содержат en_US.UTF-8, поэтому вам не нужно генерировать его с помощью локально- gen или dpkg-reconfigure.

Вот что я сделал в своем Dockerfile, чтобы заставить его работать:

FROM debian:latest
RUN apt-get update
RUN apt-get install -y locales locales-all
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
  • 1
    Описание пакета locales-all содержит: Этот пакет содержит предварительно скомпилированные данные локали для всех поддерживаемых локалей. Лучшей альтернативой является установка пакета locales и выбор только нужных локалей, но это может быть полезно на машине с небольшим объемом памяти, поскольку некоторые файлы локали требуют много памяти для компиляции.
  • 0
    E: Пакет 'locales-all' не имеет кандидата на установку
Показать ещё 3 комментария
6

Укажите эти переменные среды при запуске вашей команды:

docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -it --rm <yourimage> <yourcommand>

Нет необходимости изменять Dockerfile.

  • 0
    Простой, элегантный, гибкий. Заслуживает более +1
  • 1
    -e аргументы -e работают и с docker-compose.
Показать ещё 1 комментарий
0

Просто посмотрите на контейнерную документацию e foruns.

Вот решение для Debian, добавьте в свой Dockfile:

RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
  • 0
    Это работало для меня на Ubuntu 16.04 и 18.04, так что отличная работа!
0

Ответ @Mixel отлично сработал для имеющегося у нас образа докера на основе Ubuntu.

Тем не менее, у нас также есть образ докера на основе centos для тестирования рецептов через chef (с использованием драйвера kitchen-docker). Один из пакетов, который мы предварительно установили, не удалось установить из-за отсутствия установленной локали. Чтобы установить локаль, мне нужно было выполнить следующее:

localedef -c -f UTF-8 -i en_US en_US.UTF-8
export LC_ALL=en_US.UTF-8

Я получил эту информацию из этого ответа на ServerFault.

После запуска вышеперечисленных команд как часть докера подготовка пакета устанавливается без каких-либо ошибок. Из .kitchen.yml:

platforms:
  - name: centos7
    driver_config:
      image: #(private image)
      platform: centos
      provision_command:
      - localedef -c -f UTF-8 -i en_US en_US.UTF-8
      - export LC_ALL=en_US.UTF-8
0

Мне не нравятся переменные среды Docker, когда я не ожидаю, что пользователь изображения Docker изменит их. Я думаю, что следующее намного более чистое:

echo "LC_ALL=en_US.UTF-8" >> /etc/environment

(Edit: Это не сработает. Кажется, я тестировал это плохо изначально.)

Просто поместите его где-нибудь в один RUN. Если у вас нет локальных UTF-8, вы можете сделать следующий набор команд:

export DEBIAN_FRONTEND=noninteractive
apt-get update -q -q
apt-get install --yes locales
locale-gen --no-purge en_US.UTF-8
update-locale LANG=en_US.UTF-8
echo locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8 | debconf-set-selections
echo locales locales/default_environment_locale select en_US.UTF-8 | debconf-set-selections
dpkg-reconfigure locales
  • 0
    Просто удалите часть, где вы делаете это неправильное утверждение, или, по крайней мере, вычеркните его.
0

Для меня очень полезным было предложение от пользователя @user2915097

RUN apt-get -qq update && apt-get -qqy install locales
RUN sed -i -e 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen && \
    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen && \
    update-locale LANG=ru_RU.UTF-8 && \
    echo "LANGUAGE=ru_RU.UTF-8" >> /etc/default/locale && \
    echo "LC_ALL=ru_RU.UTF-8" >> /etc/default/locale

Ещё вопросы

Сообщество Overcoder
Наверх
Меню