Wie konfiguriere ich Unicode-Ländereinstellungen in einem Docker Ubuntu 14.04-Container?


30

Ich habe einen Ubuntu Trusty-Container mithilfe von Docker installiert und wenn ich eine Verbindung dazu herstelle, kann ich feststellen, dass das Gebietsschema auf das absolute Minimum festgelegt ist:

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=

Ich muss ein Unicode- Gebietsschema verwenden (z. B. das US-Englische en_US.UTF-8).

Ich habe versucht, die Datei / etc / default / locale zu bearbeiten, und habe Folgendes eingefügt:

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

Aber auch nach dem Verlassen des Containers und der Rückkehr ist das Gebietsschema noch nicht richtig eingestellt.

Ich habe auch versucht, den update-localeBefehl zu verwenden, ohne Erfolg:

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=

In meiner lokalen Konfiguration habe ich die folgende Konfiguration:

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=

Wie kann ich dasselbe in meinem Docker-Container haben?

Danke im Voraus!

Antworten:


19

Die /etc/default/localeDatei wird von PAM geladen. siehe /etc/pam.d/loginzum Beispiel. PAM wird jedoch nicht aufgerufen, wenn ein Befehl in einem Docker-Container ausgeführt wird. Um das Gebietsschema zu konfigurieren, legen Sie einfach die entsprechende Umgebungsvariable in Ihrer Docker-Datei fest. Beispiel:

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

1
Es funktionierte! Danke auch für die Erklärung zu PAM. Am Ende muss ich nur das Image neu erstellen (mithilfe von sudo docker build .) und es funktioniert einwandfrei.
Pierre

53

Ich benutze dies in meinem 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

Man kann auch den ENVEinzeiler verwenden:

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

2
Das ist die richtige Antwort. locale -azeigt an, dass das Gebietsschema vollständig aus dem Basis-Image entfernt wurde. locale-gengeneriert es erneut und stellt es zur Verfügung.
Abe Voelker

Wo ist das dockerfile? Kann es für heruntergeladene Bilder bearbeitet werden?
Mikhail Batcer

@MikhailBatcer Sie können ein Dockerfilein Ihrem Projektverzeichnis erstellen und die FROMDirektive verwenden, um ein vorhandenes Bild zu erweitern. Dann hängen Sie einfach die genannten Zeilen an. Dockerfile
Erfahren

3
Ich habe den folgenden Fehler: locale-gen: not found. Lösung: stackoverflow.com/a/39761477/1743367
JustAC0der

7

Versuchen

ENV LANG C.UTF-8

Wenn Sie die unsupported locale settingFehlermeldung erhalten und keine neuen Ländereinstellungen installieren möchten.


Sie können auch vermeiden, das Image für einen einzelnen Lauf neu zu docker-compose run --rm -e TERM=xterm -e LANG=C.UTF-8 worker bash
erstellen

1

Ich habe es versucht und es hat mir geholfen, Dockerfilenachdem ich mein Bild hinzugefügt habe

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

und Renn

docker-compose build
docker-compose up -d
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.