it-roy-ru.com

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

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

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

Я старался:

locale-gen nb_NO.UTF-8

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

65
mtmacdonald

Вставьте в свой 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/

102
user2915097

Те, кто использует 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 

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

68
mixel

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

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

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

31
andrewsh

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

Самым большим отличием является то, что вы должны убедиться, что оба locales и locales-all установлены, последний уже содержит en_US.UTF-8, поэтому вам не нужно генерировать его с local-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
17
Jean

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

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

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

8
Dag Høidahl

@ Mixel's answer отлично работал для имеющегося у нас образа докера на основе 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
1
E. Moffat

Просто посмотрите на контейнерную документацию 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
Eduardo Santana

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

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

(Правка: это не работает. Кажется, я сначала проверил это плохо.)

Просто поместите его где-нибудь в одно 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
Mitar

Вместо того, чтобы сбросить языковой стандарт после установки пакета locales, вы можете ответить на вопросы, которые вам обычно задают (который отключается noninteractive) перед установкой пакета, так что сценарии пакета корректно устанавливают языковой стандарт, в этом примере для английской локали (Британский, UTF-8):

RUN echo locales locales/default_environment_locale select en_GB.UTF-8 | debconf-set-selections
RUN echo locales locales/locales_to_be_generated select "en_GB.UTF-8 UTF-8" | debconf-set-selections

RUN \
  apt-get update && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y locales && \
  rm -rf /var/lib/apt/lists/*
0
Matthew Buckett