Jak skonfigurować ustawienia regionalne do Unicode w kontenerze Docker Ubuntu 14.04?

30

Zainstalowałem kontener Ubuntu Trusty za pomocą Dockera, a kiedy się z nim połączę, widzę, że ustawienia narodowe są ustawione na absolutne minimum:

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=

Muszę użyć ustawień regionalnych Unicode (na przykład amerykańskiego angielskiego en_US.UTF-8).

Próbowałem edytować plik / etc / default / locale i umieściłem go w środku:

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

Ale nawet po opuszczeniu kontenera i powrocie ustawienia regionalne nadal nie są poprawnie ustawione.

Próbowałem też użyć update-localepolecenia, ale bez powodzenia:

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=

W mojej konfiguracji lokalnej mam następującą konfigurację:

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=

Jak mogę mieć to samo w moim pojemniku Docker?

Z góry dziękuję!

Pierre
źródło

Odpowiedzi:

19

/etc/default/localePlik jest ładowany przez PAM; patrz /etc/pam.d/loginna przykład. Jednak PAM nie jest wywoływany po uruchomieniu polecenia w kontenerze Docker. Aby skonfigurować ustawienia regionalne, wystarczy ustawić odpowiednią zmienną środowiskową w pliku Docker. Przykład:

FROM ubuntu:trusty
ENV LANG en_US.UTF-8
CMD ["/bin/bash"]
Andreas Veithen
źródło
1
Zadziałało! Dzięki za wyjaśnienie dotyczące PAM. Na koniec muszę tylko odbudować obraz (używając sudo docker build .) i działa dobrze.
Pierre,
53

Używam tego w moim 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

Można również użyć ENVjednowierszowego:

RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
czerasz
źródło
2
To jest poprawna odpowiedź. locale -apokazuje, że ustawienia narodowe zostały całkowicie usunięte z obrazu podstawowego. locale-gengeneruje go ponownie i udostępnia.
Abe Voelker,
Gdzie to dockerfilejest Czy można go edytować dla pobranego obrazu?
Michaił Batcer
@MikhailBatcer można utworzyć Dockerfilew katalogu projektu i użyć FROMdyrektywy, aby rozszerzyć istniejący obraz. Następnie po prostu dodaj wspomniane linie. Dowiedz się więcej o Dockerfile tutaj
czerasz
3
Mam następujący błąd: locale-gen: not found. Rozwiązanie: stackoverflow.com/a/39761477/1743367
JustAC0der
7

Próbować

ENV LANG C.UTF-8

Jeśli pojawi się unsupported locale settingbłąd i nie chcesz instalować żadnych nowych lokalizacji.

e18r
źródło
Możesz także uniknąć przebudowywania obrazu dla pojedynczego uruchomienia: docker-compose run --rm -e TERM=xterm -e LANG=C.UTF-8 worker bash
cmoran92,
1

Próbowałem tego i pomogło mi to Dockerfilepo dodaniu obrazu

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

i biegnij

docker-compose build
docker-compose up -d
Jogi
źródło