wake-up-neo.com

Wie kann man das Gebietsschema in einem Ubuntu Docker-Container festlegen?

Ich betreibe einen Ubuntu Docker Container. Ich habe eine norwegische Tastatur und muss norwegische Zeichen (øæå) verwenden.

Meine Terminal-Zeichencodierung ist auf UTF-8 eingestellt und ich bin über SSH mit meinem Container verbunden. Ich kann jedoch keine norwegischen Zeichen eingeben, norwegische Zeichen nicht kopieren und einfügen oder CTL + UMSCHALT + U + 00f8 verwenden.

Ich habe es versucht:

locale-gen nb_NO.UTF-8

aber nichts hat sich geändert. Wie stelle ich das Gebietsschema und die Tastatur in einem Docker-Container ein?

65
mtmacdonald

Legen Sie in Ihrer Dockerfile etwas angepasst ab 

# 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     

dies wird aus dem sehr guten Beitrag zu diesem Thema entnommen, aus 

http://jaredmarkell.com/docker-and-locales/

102
user2915097

Diejenigen, die Debian verwenden, müssen auch das Paket locales installieren.

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 

Diese Antwort hat mir sehr geholfen.

68
mixel

Einfach hinzufügen 

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

in dein Dockerfile. Für die grundlegende Operation ist nichts anderes erforderlich. locale-gen akzeptiert keine Argumente, weshalb keine der "Korrekturen", die ihn verwenden, funktioniert.

31
andrewsh

Ich habe tatsächlich an dem gleichen Problem gelitten, aber keine der Antworten ist zu 100% mit Debian zu arbeiten: spätestens, auch wenn sie gute Hinweise geben.

Der größte Unterschied ist, dass Sie sicherstellen sollten, dass sowohl locales als auch locales-all installiert sind. Letzteres enthält bereits en_US.UTF-8, sodass Sie es nicht mit generieren müssen local-gen oder dpkg-reconfigure.

Folgendes habe ich in meiner Dockerfile gemacht, damit es funktioniert:

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
17
Jean

Geben Sie diese Umgebungsvariablen an, wenn Sie Ihren Befehl ausführen:

docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -it --rm <yourimage> <yourcommand>

Es ist nicht notwendig, die Dockerfile zu ändern.

8
Dag Høidahl

@ Mixels answer hat für das auf Ubuntu basierende Docker-Image, das wir haben, großartig funktioniert.

Wir haben jedoch auch ein Centos-basiertes Docker-Image zum Testen von Rezepten über einen Koch (mit dem kitchen-docker-Treiber). Eines der von uns vorinstallierten Pakete konnte nicht installiert werden, da kein Gebietsschema festgelegt wurde. Um ein Gebietsschema installieren zu lassen, musste ich Folgendes ausführen:

localedef -c -f UTF-8 -i en_US en_US.UTF-8
export LC_ALL=en_US.UTF-8

Ich habe diese Informationen von diese Antwort auf ServerFault erhalten.

Nachdem Sie die obigen Befehle als Teil des Dockers ausgeführt haben, wird das Paket ohne Fehler installiert. Von .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
E. Moffat

Schauen Sie sich einfach die Container-Dokumentation an.

Hier ist eine Lösung für Debian , die zu Ihrem Dockfile hinzugefügt wird:

RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
0
Eduardo Santana

Ihr braucht diese komplexen Dinge nicht, um die Locales auf Ubuntu/Debian einzustellen. Sie brauchen nicht einmal die Datei /etc/local.gen.

Einfach locale-gen macht alles und der Autor hat nur das locales -Paket verpasst.

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

Ich fand das am einfachsten und effektivsten. Ich bestätige, dass es auf Ubuntu 16.04 funktioniert.

0
Bumsik Kim

Ich mag es nicht, Docker-Umgebungsvariablen zu haben, wenn ich nicht davon ausgehe, dass der Benutzer eines Docker-Images sie ändert. Ich denke, das Folgende ist viel sauberer:

echo "LC_ALL=en_US.UTF-8" >> /etc/environment

(Edit: Das funktioniert nicht. Anscheinend habe ich es anfangs schlecht getestet.)

Legen Sie es einfach irgendwo in eine RUN. Wenn Sie keine UTF-8-Gebietsschemas generiert haben, können Sie die folgenden Befehle ausführen:

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
0
Mitar

Anstatt das Gebietsschema nach der Installation des locales-Pakets zurückzusetzen, können Sie die Fragen beantworten, die normalerweise vor der Installation des Pakets gestellt werden (was durch noninteractive deaktiviert wird), damit die Paketskripte das Gebietsschema korrekt einrichten. In diesem Beispiel wird das Gebietsschema auf Englisch festgelegt (Britisch, 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/*
0
Matthew Buckett