Как установить локаль внутри контейнера Debian/Ubuntu Docker?
Я запускаю контейнер Ubuntu Docker. У меня есть норвежская клавиатура и вам нужно использовать норвежских персонажей (øæå).
Кодирование символов My Terminal настроено на UTF-8, и я подключен к своему контейнеру с использованием SSH. Тем не менее, я не могу напечатать норвежских символов, не копировать и вставлять норвежские символы, а также использовать CTL + SHIFT + U + 00f8.
Я пробовал:
locale-gen nb_NO.UTF-8
но ничего не изменилось. Как установить языковой стандарт и клавиатуру внутри контейнера Docker?
Ответы
Ответ 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.