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

124

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

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

Я попытался:

locale-gen nb_NO.UTF-8

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

mtmacdonald
источник

Ответы:

174

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

user2915097
источник
1
Он не работает, когда вы используете debian: jessie в качестве базового контейнера
iDexter
22
вам нужно apt-get -y install localesпри использовании Ubuntu
user2915097
2
Мне пришлось добавить RUN touch /usr/share/locale/locale.aliasперед вызовом locale-gen, чтобы избежать фатальной ошибки «файл не найден»
Пол Кейстер
6
sedСценарий рода неуклюжим. Старайтесь s/# \(en_US\.UTF-8 .*\)/\1/не повторять поисковую фразу в строке замены, фиксируя ее.
Tripleee
3
Если вы не хотите создавать дополнительные слои, вы можете написатьENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Андре Равацци
100

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

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 

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

Mixel
источник
63

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

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

в ваш Dockerfile. (Возможно, вам потребуется убедиться, что localesпакет установлен.) Для основной операции больше ничего не требуется. Между тем, за пределами Ubuntu, locale-genне принимает никаких аргументов, поэтому ни одно из «исправлений», использующих его, не работает, например, в Debian. Ubuntu пропатчена, locale-genчтобы принять список локалей для генерации, но патч на данный момент не принят ни в Debian, ни где-либо еще.

andrewsh
источник
1
У меня не сработало с образом Ubuntu. Однако этот ответ сработал.
dialex
4
Не могли бы вы рассказать подробнее? C.UTF-8доступно на все системы без необходимости устанавливать что - либо, и это должно быть в основном достаточно.
andrewsh
Работает с Docker ubuntu: 18.04 image. Мне нужен был только "LANG". Устанавливать тоже не пришлось locales.
wisbucky
1
Если вы хотите установить это только во время выполнения, вы можете docker runвместо этого установить переменные env в команде args: stackoverflow.com/questions/28405902/…
wisbucky
1
На Ubuntu их необходимо установитьapt-get install -y locales
gerardnico,
27

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

Самая большая разница заключается в том, что вы должны убедиться, что установлены и 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
джинсовый
источник
2
В описании пакета locales-all есть: Этот пакет содержит предварительно скомпилированные данные локали для всех поддерживаемых локалей. Лучшей альтернативой является установка пакета локалей и выбор только желаемых локалей, но он может быть полезен на машине с низким объемом памяти, поскольку для компиляции некоторых файлов локали требуется много памяти.
user2707671 03
E: Пакет 'locales-all' не имеет кандидата на установку
AstraSerg
@AstraSerg: Я очень удивлен, что вы получили эту ошибку. Какой выход apt-cache show locales-all? Это определенно официальный пакет, доступный в Debian.
Жан
@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Невозможно выбрать версии из пакета 'locales-all', так как это чисто виртуальный N: Пакеты не найдены Ubuntu 18.04.1 LTS \ n \ l
AstraSerg
@AstraSerg: На самом деле я ничего не знаю об Ubuntu, так как пробовал это только для Debian (см. FROM debian: latest в предоставленном мной фрагменте Dockerfile).
Жан
19

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

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

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

Даг Хёйдал
источник
2
В -eаргументах работают с Докером-композом также, кстати.
Dag Høidahl
5
Это работает, потому что большинство дистрибутивов включают C.UTF-8локаль. Обычно они не включают языковые стандарты (например en_US.UTF-8). Для этого вам нужно установить locales-all(большой) или установить localesи запустить locale-genпосле окончания /etc/locale.gen.
Джонатон Рейнхарт
5

Совет: просмотрите форумы документации по контейнерам, например форум 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.UTF-8
Эдуардо Сантана
источник
3

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

Бумсик Ким
источник
2

@ 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
Э. Моффат
источник
1

Мне не нравятся переменные среды 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
Mitar
источник
Это казалось здесь единственным разумным ответом, потому что он позволяет избежать проблем с переменными окружения. Однако это не работает. localeвывод не изменяется ни при выполнении последующих команд, ни при выполнении последующих RUNблоков, ни при построении другого изображения с использованием текущего изображения в качестве основы. Может быть, потребуются дополнительные действия, чтобы применить эти изменения?
user7860670
Приведенные выше команды позволяют создавать языковые стандарты, если они вам не нужны. Если вы хотите их использовать, вы должны установить их как переменную среды. Или, как я предлагаю в этом ответе, непосредственно внутри RUN или, установив Docker ENVlike ENV LC_ALL=en_US.UTF-8.
Митар
-1

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

Для меня то, что работало в образе 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
alexopoulos7
источник
-1

Я использовал это (после 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! 👌правильно.

Карлос Пинсон
источник