Wie lege ich das Gebietsschema in einem Debian / Ubuntu Docker-Container fest?


122

Ich verwende 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, keine norwegischen Zeichen 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 lege ich das Gebietsschema und die Tastatur in einem Docker-Container fest?

Antworten:


170

Fügen Sie in Ihre Docker-Datei etwas Angepasstes ein

# 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 extrahiert, aus

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


1
Es funktioniert nicht, wenn Sie debian: jessie als
Basiscontainer verwenden

22
Sie müssen apt-get -y install localesbei der Verwendung von Ubuntu
user2915097

2
Ich musste RUN touch /usr/share/locale/locale.aliasvor dem Aufruf hinzufügen locale-gen, um eine schwerwiegende Datei nicht gefunden Fehler zu vermeiden
Paul Keister

6
Das sedSkript ist etwas ungeschickt. Versuchen Sie s/# \(en_US\.UTF-8 .*\)/\1/zu vermeiden , dass die Phrasensuche zu wiederholen in der Ersatzzeichenfolge durch sie einzufangen.
Tripleee

3
Wenn Sie vermeiden möchten, zusätzliche Ebenen zu erstellen, können Sie schreibenENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

99

Diejenigen, die Debian verwenden, müssen auch das localesPaket 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.


63

Einfach hinzufügen

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

in Ihre Docker-Datei. (Möglicherweise müssen Sie sicherstellen, dass das localesPaket installiert ist.) Für die Grundoperation ist nichts anderes erforderlich. Währenddessen locale-genakzeptiert Ubuntu außerhalb von Ubuntu keine Argumente. Deshalb funktioniert keine der 'Fixes', die es verwenden, zB unter Debian. Ubuntu hat gepatcht locale-gen, um eine Liste der zu generierenden Gebietsschemas zu akzeptieren, aber der Patch wurde im Moment in Debian nirgendwo anders akzeptiert.


1
Hat bei einem Ubuntu-Image nicht funktioniert. Diese Antwort hat jedoch funktioniert.
Dialex

4
Könnten Sie bitte Einzelheiten angeben? C.UTF-8ist auf allen Systemen verfügbar, ohne dass etwas installiert werden muss, und es sollte größtenteils ausreichen.
Andrewsh

Funktioniert mit Docker Ubuntu: 18.04 Image. Ich brauchte nur "LANG". Ich musste auch nicht installieren locales.
wisbucky

1
Wenn Sie dies nur zur Laufzeit festlegen möchten, können Sie docker runstattdessen die env-Variablen in den Befehlsargumenten festlegen
wisbucky

1
Unter Ubuntu müssen Sie sie installierenapt-get install -y locales
gerardnico

27

Ich hatte tatsächlich das gleiche Problem, aber keine der Antworten funktioniert zu 100% mit Debian: Neueste, auch wenn sie gute Hinweise liefern.

Der größte Unterschied besteht darin, dass Sie sicherstellen sollten, dass sowohl Gebietsschemas als auch Gebietsschemas installiert sind, wobei letzteres bereits en_US.UTF-8 enthält, damit Sie es nicht mit local-gen oder dpkg- recfigure generieren müssen .

Folgendes habe ich in meiner Docker-Datei getan, 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

2
Die Beschreibung des Gebietsschemas-all-Pakets lautet: Dieses Paket enthält die vorkompilierten Gebietsschemadaten für alle unterstützten Gebietsschemas. Eine bessere Alternative besteht darin, das Gebietsschemapaket zu installieren und nur die gewünschten Gebietsschemas auszuwählen. Dies kann jedoch auf einem Computer mit wenig Speicher nützlich sein, da einige Gebietsschemadateien viel Speicher zum Kompilieren benötigen.
user2707671

E: Paket 'locales-all' hat keinen Installationskandidaten
AstraSerg

@AstraSerg: Ich bin sehr überrascht, dass Sie diesen Fehler haben. Was ist die Ausgabe von apt-cache show locales-all? Es ist definitiv immer noch ein offizielles Paket und in Debian verfügbar.
Jean

@ Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Es können keine Versionen aus dem Paket 'locales-all' ausgewählt werden, da es rein virtuell ist. N: Keine Pakete gefunden. Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: Ich weiß es eigentlich nicht für Ubuntu, da ich das nur für Debian versucht habe (siehe FROM debian: Neueste in dem von mir bereitgestellten Dockerfile-Snippet).
Jean

19

Geben Sie die Variablen LANGund LC_ALLumgebungsvariablen an, -ewenn 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 erforderlich, die Docker-Datei zu ändern.


2
Die -eArgumente funktionieren übrigens auch mit Docker-Compose.
Dag Høidahl

5
Dies funktioniert, da die meisten Distributionen das C.UTF-8Gebietsschema enthalten. Sie enthalten normalerweise keine sprachspezifischen Gebietsschemas (z en_US.UTF-8. B. ). Dafür müssen Sie nicht installieren locales-all(groß) oder nach dem Beenden installieren localesund ausführen . locale-gen/etc/locale.gen
Jonathon Reinhart

5

Tipp: Durchsuchen Sie die Container-Dokumentationsforen wie das Docker-Forum .

Hier ist eine Lösung für Debian & Ubuntu. Fügen Sie Ihrer Docker-Datei Folgendes hinzu:

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.UTF-8

3

Ihr braucht diese komplexen Dinge nicht, um Gebietsschemas auf Ubuntu / Debian festzulegen. Du brauchst nicht einmal/etc/local.gen Datei.

Einfach locale-genalles machen und der Autor nur localesPaket 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 unter Ubuntu 16.04 funktioniert.


2

Die Antwort von @ Mixel hat für das Ubuntu-basierte Docker-Image, das wir haben, hervorragend funktioniert.

Wir haben jedoch auch ein Centos-basiertes Docker-Image zum Testen von Rezepten über den Koch (unter Verwendung des kitchen-dockerTreibers). Eines der Pakete, die wir vorinstalliert haben, konnte nicht installiert werden, da kein Gebietsschema festgelegt wurde. Um ein Gebietsschema zu installieren, 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 aus dieser Antwort auf ServerFault erhalten .

Nachdem Sie die obigen Befehle als Teil der Docker-Bereitstellung ausgeführt haben, wird das Paket fehlerfrei 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

Ich mag keine Docker-Umgebungsvariablen, wenn ich nicht erwarte, dass Benutzer eines Docker-Images diese ändern.

Legen Sie es einfach irgendwo in einen 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

Dies schien hier die einzig vernünftige Antwort zu sein, da dadurch das Verschrauben mit Umgebungsvariablen vermieden wird. Es funktioniert jedoch nicht. localeDie Ausgabe wird weder beim Ausführen nachfolgender Befehle noch beim Ausführen nachfolgender RUNBlöcke oder beim Erstellen eines anderen Images unter Verwendung des aktuellen Images als Basis geändert . Möglicherweise sind zusätzliche Maßnahmen erforderlich, um diese Änderungen tatsächlich anzuwenden?
user7860670

Mit den obigen Befehlen generieren Sie Gebietsschemas, wenn Sie sie vermissen. Wenn Sie sie verwenden möchten, müssen Sie sie als Umgebungsvariable festlegen. Oder, wie ich in dieser Antwort direkt innerhalb von RUN vorschlage, oder indem Sie Docker ENVwie einstellen ENV LC_ALL=en_US.UTF-8.
Mitar

-1

Anstatt das Gebietsschema nach der Installation des Gebietsschema-Pakets zurückzusetzen, können Sie die Fragen beantworten, die Ihnen normalerweise gestellt werden (was durch deaktiviert ist noninteractive), bevor Sie das Paket installieren, damit die Paketskripte das Gebietsschema korrekt einrichten. In diesem Beispiel wird das Gebietsschema auf Englisch gesetzt ( 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/*

-1

Für mich, was in Ubuntu Image funktioniert hat :

FROM ubuntu:xenial
USER root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install --no-install-recommends -y locales && rm -rf /var/lib/apt/lists/*
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf

-1

Ich habe dies (nach RUN apt-get install -y python3) verwendet:

RUN apt-get install -y locales
RUN apt-get install -y language-pack-en
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en 
ENV LC_ALL en_US.UTF-8
RUN python3 -c "print('UTF8 works nice! 👌')"

Und es druckt UTF8 works nice! 👌richtig.

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.