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

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

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

Я старался:

locale-gen nb_NO.UTF-8

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

19 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Вам, ребята, не нужны эти сложные вещи для установки локалей в 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.

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

Мне не нравится иметь переменные окружения 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

Я использовал это (после RUN apt-get install -y python3):

RUN apt-get install -y locales
RUN apt-get install -y language-pack-en
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en 
ENV LC_ALL en_US.UTF-8
RUN python3 -c "print('UTF8 works nice! ')"

И он печатает UTF8 works nice! правильно.

в "Dockerfile":

      # Set the locale in container
RUN apt-get -y install locales
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

наслаждайся этим!

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

для ubuntu 14.04, где нет файла в /etc/locale.gen, но он разделяет файл /etc/default/locale. Так что для надежных (ubuntu 14.04) просто запустите

      RUN apt-get -y install locales && \
     update-locale LANG=en_US.UTF-8

Так что хотя бы глобальный языковой стандарт по умолчанию будет изменен с раздражающего «POSIX» на нужный вам языковой стандарт.

В Debian мне пришлось...

1 - Отредактируйте файл локали

      sudo nano /etc/default/locale

2 - Раскомментируйте локаль, которую я хотел использовать в моем случае "es_ES.UTF-8 UTF-8"

3 - Выполнить:

      sudo locale-gen

Надеюсь, это сэкономит время тем, кто столкнется с этой проблемой в Debian.

Вы можете использовать команду и аргументы для установки локалей, установите локаль по умолчанию, а затем запустите /docker_entry.sh:

Используйте /bin/bash в качестве команды и весь скрипт в качестве аргумента.

Пример установки всех локалей (рекомендуется обратить внимание, укажите, какие из них вам нужны)

Команда :

      ["/bin/bash", "-c"]

Аргументы :

      |
 apt-get update && apt-get install -y locales && sed -i 's/^# \\(.*\\)/\\1/' /etc/locale.gen && locale-gen;
export LANG=en_US.UTF-8;
export LC_ALL=en_US.UTF-8;
/docker-entrypoint.sh

У меня возникла проблема с установкой локали в контейнере Ubuntu. Это не было прочитано с/etc/default/locale. Я получил:

      LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME=C.UTF-8
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Итак, я установил переменные системной среды. Который будет прочитан при входе в систему. источник

Итак, то, что я сделал, установлено

      sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

и

sudo nano /etc/profile.d/set-locale.sh

      export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
export LC_ALL=en_US.UTF-8

Теперь мойlocaleявляется:

      LANG=en_US.UTF-8
LANGUAGE=en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Я также столкнулся с аналогичной проблемой, когда моя австрийская клавиатура не работала должным образом. На основе всех других ответов в этом посте и моего собственного тестирования / исследования я мог придумать следующее решение для официального образа Ubuntu 20.04 Docker. На самом деле мне нужно было реализовать два шага, чтобы заставить его работать:

  1. Убедитесь, что языковые стандарты установлены и необходимый языковой пакет подготовлен для создания образа в вашем Dockerfile.

    ДОКЕРФАЙЛ:

       RUN apt-get update -qq \
    && apt-get install -qq -y --no-install-recommends locales \
    && sed -i -e 's/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen \
    && dpkg-reconfigure --frontend=noninteractive locales \
    && update-locale LANG=de_AT.UTF-8
  1. Обязательно запускайте контейнер с дополнительными параметрами переменных окружения.

    ОБОЛОЧКА:

       docker run \
   --env LANG=de_AT.UTF-8 \
   --env LANGUAGE=de_AT:de \
   --env LC_ALL=de_AT.UTF-8 \
   ubuntu:20.04

С некоторыми небольшими изменениями этот подход должен работать и для других регионов.

Это было полезно для меня, когда я пытался добавить дополнительную локаль вpostgres:13.2контейнер без кастомаDockerfile. Впервые я попробовал подход бегаlocale-genс именованной локалью (например,locale-gen sv_FI.UTF-8), но у меня это, похоже, не сработало (в данном случае образ основан на Debian Buster). Он перезаписывает базу данных локалей пустым списком локалей, что нарушает запуск Postgres.

Однако это сработало для меня. Вам нужно добавить оба значения по умолчаниюen_US.UTF-8локаль в данном случае И вашу пользовательскую локаль, поскольку/etc/locale.genпо умолчанию все локали отключены.

Вот отрывок из моегоdocker-compose.ymlфайл:

      entrypoint:
  - /bin/sh
  - -c
  - sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen &&
      sed -i -e 's/# sv_FI.UTF-8 UTF-8/sv_FI.UTF-8 UTF-8/' /etc/locale.gen &&
      locale-gen &&
      docker-entrypoint.sh postgres

Для меня то, что работало в образе ubuntu:

FROM ubuntu:xenial
USER root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install --no-install-recommends -y locales && rm -rf /var/lib/apt/lists/*
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf

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