Come impostare la locale all'interno di un container Docker Debian / Ubuntu?


124

Sto eseguendo un container Docker di Ubuntu. Ho una tastiera norvegese e devo usare caratteri norvegesi (øæå).

La mia codifica dei caratteri del terminale è impostata su UTF-8 e sono connesso al mio contenitore tramite SSH. Tuttavia, non sono in grado di digitare caratteri norvegesi, né di copiare e incollare caratteri norvegesi, né di utilizzare CTL + MAIUSC + U + 00f8.

Provai:

locale-gen nb_NO.UTF-8

ma niente è cambiato. Come si impostano le impostazioni internazionali e la tastiera all'interno di un contenitore Docker?

Risposte:


172

Inserisci nel tuo Dockerfile qualcosa di adattato da

# 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     

questo è estratto dall'ottimo post su quell'argomento, da

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


1
Non funziona quando usi debian: jessie come contenitore di base
iDexter

22
è necessario apt-get -y install localesquando si utilizza Ubuntu
user2915097

2
Ho dovuto aggiungere RUN touch /usr/share/locale/locale.aliasprima della chiamata a locale-genper evitare un errore irreversibile di file non trovato
Paul Keister

6
La sedsceneggiatura è un po 'goffa. Cerca s/# \(en_US\.UTF-8 .*\)/\1/di evitare di ripetere la frase di ricerca nella stringa di sostituzione catturandola.
tripleee

3
Se vuoi evitare di creare livelli aggiuntivi, puoi scrivereENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

100

Coloro che usano Debian devono anche installare il localespacchetto.

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 

Questa risposta mi ha aiutato molto.


63

Basta aggiungere

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

nel tuo Dockerfile. (Potrebbe essere necessario assicurarsi che il localespacchetto sia installato.) Non è necessario nient'altro per l'operazione di base. Nel frattempo, al di fuori di Ubuntu, locale-gennon accetta alcun argomento, ecco perché nessuna delle "correzioni" che lo utilizzano funziona, ad esempio, su Debian. Ubuntu ha patchato locale-genper accettare un elenco di localizzazioni da generare, ma la patch al momento non è stata accettata in Debian o altrove.


1
Non ha funzionato per me su un'immagine Ubuntu. Questa risposta però ha funzionato.
dialex

4
Potrebbe fornire dettagli? C.UTF-8è disponibile su tutti i sistemi senza la necessità di installare nulla e dovrebbe essere per lo più sufficiente.
andrewsh

Funziona con Docker ubuntu: immagine 18.04. Avevo solo bisogno di "LANG". Non ho nemmeno bisogno di installarlo locales.
wisbucky

1
Se si desidera solo impostare questo in fase di esecuzione, è possibile impostare l'env vars nelle docker runargs comando invece: stackoverflow.com/questions/28405902/...
wisbucky

1
Su Ubuntu, è necessario installarliapt-get install -y locales
gerardnico

27

In realtà mi è capitato di soffrire dello stesso problema, ma nessuna delle risposte fornite funziona al 100% con debian: latest, anche se forniscono buoni suggerimenti.

La differenza più grande è che dovresti assicurarti che siano installati sia locales che locales-all , quest'ultimo già contenente en_US.UTF-8, quindi non devi generarlo con local-gen o dpkg-reconfigure .

Ecco cosa ho fatto nel mio Dockerfile per farlo funzionare:

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
La descrizione del pacchetto locales-all ha: Questo pacchetto contiene i dati delle impostazioni locali precompilate per tutte le lingue supportate. Un'alternativa migliore è installare il pacchetto locales e selezionare solo le localizzazioni desiderate, ma può essere utile su una macchina con poca memoria perché alcuni file di localizzazione richiedono molta memoria per essere compilati.
user2707671

E: Il pacchetto "locales-all" non ha candidati per l'installazione
AstraSerg

@AstraSerg: sono molto sorpreso che tu abbia ricevuto quell'errore. Qual è il risultato apt-cache show locales-all? È sicuramente ancora un pacchetto ufficiale e disponibile in Debian.
Jean

@ Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Impossibile selezionare le versioni dal pacchetto 'locales-all' poiché è puramente virtuale N: Nessun pacchetto trovato Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: In realtà non so per Ubuntu da quando l'ho provato solo per Debian (vedi FROM debian: ultimo nello snippet Dockerfile che ho fornito).
Jean

19

Specificare le variabili di ambiente LANGe LC_ALLutilizzando -edurante l'esecuzione del comando:

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

Non è necessario modificare il Dockerfile.


2
A -eproposito, gli argomenti funzionano anche con docker-compose.
Dag Høidahl

5
Questo funziona perché la maggior parte delle distribuzioni include la C.UTF-8locale. Di solito non includono locali specifici della lingua (ad esempio en_US.UTF-8). Per questo è necessario installare locales-all(big) o installare localesed eseguire locale-gendopo aver terminato /etc/locale.gen.
Jonathon Reinhart

5

Suggerimento: sfoglia i forum della documentazione del contenitore, come il forum Docker .

Ecco una soluzione per Debian e Ubuntu , aggiungi quanto segue al tuo Dockerfile:

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

Ragazzi non avete bisogno di queste cose complesse per impostare le impostazioni locali su Ubuntu / Debian. Non hai nemmeno bisogno di /etc/local.genfile.

Semplicemente locale-genfarà tutto e l'autore manca solo il localespacchetto.

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

Ho trovato questo il più semplice e il più efficace. Confermo che funziona su Ubuntu 16.04.


2

La risposta di @ Mixel ha funzionato alla grande per l'immagine docker basata su Ubuntu che abbiamo.

Tuttavia, abbiamo anche un'immagine docker basata su centos per testare le ricette tramite lo chef (utilizzando il kitchen-dockerdriver). Uno dei pacchetti che abbiamo preinstallato non si installava a causa della mancanza di impostazioni locali. Per installare una locale, ho dovuto eseguire quanto segue:

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

Ho ottenuto queste informazioni da questa risposta su ServerFault .

Dopo aver eseguito i comandi precedenti come parte del provisioning docker, il pacchetto viene installato senza errori. Da .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

Non mi piace avere variabili di ambiente Docker quando non mi aspetto che l'utente di un'immagine Docker le modifichi.

Mettilo da qualche parte in uno RUN. Se non hai generato localizzazioni UTF-8, puoi eseguire la seguente serie di comandi:

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

Questa sembrava essere l'unica risposta sensata qui perché evita di rovinare le variabili d'ambiente. Comunque, non funziona. localel'output non viene modificato durante l'esecuzione di comandi successivi, né durante l'esecuzione di RUNblocchi successivi , né quando si costruisce un'altra immagine utilizzando l'immagine corrente come base. Forse è necessaria qualche azione aggiuntiva per applicare effettivamente queste modifiche?
user7860670

I comandi sopra spiegano come generare le impostazioni locali se ti mancano. Se vuoi usarli, devi impostarlo come variabile d'ambiente. Oppure, come sto proponendo in questa risposta direttamente all'interno di RUN, oppure, impostando Docker ENVcome ENV LC_ALL=en_US.UTF-8.
Mitar,

-1

Anziché ripristinare le impostazioni locali dopo l'installazione del pacchetto locales puoi rispondere alle domande che ti verrebbero normalmente poste (che è disabilitato da noninteractive) prima di installare il pacchetto in modo che gli script del pacchetto impostino le impostazioni locali correttamente, questo esempio imposta le impostazioni locali su inglese ( Britannico, 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

Per me cosa ha funzionato nell'immagine di Ubuntu :

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

Ho usato questo (dopo RUN apt-get install -y python3):

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! 👌')"

E stampa UTF8 works nice! 👌correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.