Як встановити локаль всередині контейнера Docker Debian / Ubuntu?


124

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

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

Я намагався:

locale-gen nb_NO.UTF-8

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

Відповіді:


172

Помістіть у свій 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/


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/уникати повторення пошукової фрази в рядку заміни, захоплюючи її.
трійчастий

3
Якщо ви хочете уникнути створення додаткових шарів, можете написатиENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre

100

Тим, хто використовує 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 

Це відповідь мені дуже допомогла.


63

Просто додайте

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

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


1
Не працював для мене на зображенні Ubuntu. Ця відповідь хоч і спрацювала.
dialex

4
Чи можете ви, будь ласка, надати якісь деталі? C.UTF-8доступний у всіх системах без необхідності нічого встановлювати, і цього має бути переважно достатньо.
andrewsh

Працює з Docker ubuntu: 18.04 зображення. Мені потрібна була лише "МОВА". Мені також не потрібно було встановлювати locales.
wisbucky

1
Якщо ви хочете , щоб встановити це під час виконання, ви можете встановити окр вари в docker runкомандних аргументах замість: stackoverflow.com/questions/28405902 / ...
wisbucky

1
На Ubuntu їх потрібно встановитиapt-get install -y locales
gerardnico

27

Насправді я постраждав від тієї ж проблеми, але жоден із запропонованих відповідей на 100% не працює з debian: останні, навіть якщо вони дають хороші підказки.

Найбільша відмінність полягає в тому, що ви повинні переконатися, що встановлені як локалі , так і локали - усі вони вже містять en_US.UTF-8, тому вам не доведеться генерувати це за допомогою перенастроювання local-gen або dpkg .

Ось що я зробив у своєму 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

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 (див. ВІД debian: останнє у фрагменті 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.
Джонатан Райнхарт


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

@ Відповідь Мікселя працював великий для Ubuntu основі докер зображення , яке ми маємо.

Однак у нас також є зображення докера на основі центів для тестування рецептів через шеф-кухаря (за допомогою 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

Це здавалося єдиною розумною відповіддю тут, оскільки це дозволяє уникнути викручування змінних середовища. Однак це не працює. localeвисновок не змінюється при виконанні наступних команд, ні при виконанні наступних RUNблоків, ні при побудові іншого зображення, використовуючи поточне зображення як базове. Можливо, потрібні якісь додаткові дії, щоб реально застосувати ці зміни?
користувач7860670

Наведені вище команди - це те, як ви генеруєте локалі, якщо вони відсутні. Якщо ви хочете їх використовувати, ви повинні встановити його як змінну середовища. Або, як я пропоную у цій відповіді безпосередньо в RUN, або, встановивши Docker ENVяк ENV LC_ALL=en_US.UTF-8.
Мітар

-1

Замість того, щоб скидати локальну мову після встановлення пакету 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/*

-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

-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! 👌правильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.