Как настроить локали для 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генерирует его снова и делает его доступным.
Абе Воелкер

Где это 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.