Подтвердить что ты не робот

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

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

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

Я пробовал:

locale-gen nb_NO.UTF-8

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

4b9b3361

Ответ 1

Поместите в свой файл 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/

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

На самом деле я столкнулся с одной и той же проблемой, но ни один из предоставленных ответов не работает с 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

Ответ 5

Укажите переменные среды LANG и LC_ALL используя -e при запуске вашей команды:

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

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

Ответ 6

Совет: просмотрите форумы по документации контейнера, например, форум Docker.

Вот решение для Debian & Ubuntu, добавьте следующее в ваш Dockerfile:

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

Ответ 7

Ответ @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

Ответ 8

Для меня очень полезным было предложение от пользователя @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

Ответ 9

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

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

Ответ 10

Вместо того, чтобы сбрасывать языковой стандарт после установки пакета 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/*

Ответ 11

Вам, ребята, не нужны эти сложные вещи для установки локалей в Ubuntu/Debian. Вам даже не нужен файл /etc/local.gen.

Просто locale-gen сделает все, а автор пропустил только пакет locales.

RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
 && locale-gen "en_US.UTF-8"
ENV LANG=en_US.UTF-8 \
    LANGUAGE=en_US:en \
    LC_ALL=en_US.UTF-8

Я нашел это самым простым и эффективным. Я подтверждаю, что это работает на Ubuntu 16.04.