Як налаштувати локалі для Unicode в контейнері Docker Ubuntu 14.04?


30

Я встановив контейнер Ubuntu Trusty за допомогою Docker, і коли я підключаюсь до нього, я можу побачити, що локаль встановлений на мінімальному рівні:

sudo docker run -i -t <id> /bin/bash
root@<id>:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
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=

Мені потрібно скористатися локальним словом Unicode (наприклад, англійською мовою США, en_US.UTF-8).

Я спробував відредагувати файл / etc / default / locale і помістити це всередину:

# cat /etc/default/locale 
LANG=en_US.UTF-8

Але навіть після виходу з контейнера та повернення назад, мова все ще не встановлений належним чином.

Я також намагався використовувати update-localeкоманду, не маючи успіху:

root@cab13a6abe4f:/# update-locale LANG=en_US.UTF-8
root@cab13a6abe4f:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
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=

У моїй локальній конфігурації у мене є така конфігурація:

LANG=en_US.UTF-8
LANGUAGE=en_US
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=

Як я можу мати те саме в своєму контейнері Docker?

Спасибі заздалегідь!

Відповіді:


19

/etc/default/localeФайл завантажується РАМ; див /etc/pam.d/login. Однак PAM не викликається під час виконання команди в контейнері Docker. Щоб налаштувати локаль, просто встановіть відповідну змінну середовища у вашому Dockerfile. Приклад:

FROM ubuntu:trusty
ENV LANG en_US.UTF-8
CMD ["/bin/bash"]

1
Це спрацювало! Дякуємо за пояснення і щодо PAM. Врешті-решт, мені просто потрібно відновити зображення (за допомогою sudo docker build .), і воно прекрасно працює.
П'єр

53

Я використовую це у своїх Dockerfile:

# Set the locale
RUN locale-gen en_US.UTF-8  
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

Можна також скористатися ENVоднолінійним:

RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

2
Це правильна відповідь. locale -aпоказує, що локаль повністю видалено з базового зображення. locale-genгенерує його знову і робить доступним.
Abe Voelker

Де це dockerfile? Чи можна його редагувати для завантаженого зображення?
Михайло Батцер

@MikhailBatcer можна створити Dockerfileв каталозі свого проекту та використовувати FROMдирективу для розширення наявного зображення. Потім просто додайте згадані рядки. Дізнайтеся більше про Dockerfile тут
czerasz

3
Я отримав наступне повідомлення про помилку: locale-gen: not found. Рішення: stackoverflow.com/a/39761477/1743367
JustAC0der

7

Спробуйте

ENV LANG C.UTF-8

Якщо ви отримаєте unsupported locale settingпомилку і не хочете встановлювати нові локалі.


Ви також можете уникнути перебудови зображення за один запуск: docker-compose run --rm -e TERM=xterm -e LANG=C.UTF-8 worker bash
cmoran92

1

Я спробував це, і це мені допомогло Dockerfileпісля додавання іміджу

ENV LANG='en_GB.UTF-8' LANGUAGE='en_GB:en' LC_ALL='en_GB.UTF-8'
RUN echo en_GB.UTF-8 UTF-8 >> /etc/locale.gen && locale-gen

і біжи

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