Comment définir les paramètres régionaux dans un conteneur Docker Debian / Ubuntu?


124

J'exécute un conteneur Ubuntu Docker. J'ai un clavier norvégien et je dois utiliser des caractères norvégiens (øæå).

Le codage de caractères de mon terminal est défini sur UTF-8 et je suis connecté à mon conteneur en utilisant SSH. Cependant, je ne peux pas taper des caractères norvégiens, ni copier et coller des caractères norvégiens, ni utiliser CTL + SHIFT + U + 00f8.

J'ai essayé:

locale-gen nb_NO.UTF-8

mais rien n'a changé. Comment définir les paramètres régionaux et le clavier dans un conteneur Docker?

Réponses:


174

Mettez dans votre Dockerfile quelque chose d'adapté de

# 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     

ceci est extrait du très bon article sur ce sujet, de

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


1
Cela ne fonctionne pas lorsque vous utilisez debian: jessie comme conteneur de base
iDexter

22
vous devez apt-get -y install localeslorsque vous utilisez Ubuntu
user2915097

2
J'ai dû ajouter RUN touch /usr/share/locale/locale.aliasavant l'appel à locale-genafin d'éviter une erreur fatale de fichier introuvable
Paul Keister

6
Le sedscript est un peu maladroit. Essayez s/# \(en_US\.UTF-8 .*\)/\1/d'éviter de répéter la phrase de recherche dans la chaîne de remplacement en la capturant.
tripleee

3
Si vous voulez éviter de créer des couches supplémentaires, vous pouvez écrireENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

100

Ceux qui utilisent Debian doivent également installer le localespackage.

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 

Cette réponse m'a beaucoup aidé.


63

Il suffit d'ajouter

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

dans votre Dockerfile. (Vous devrez peut-être vous assurer que le localespackage est installé.) Rien d'autre n'est nécessaire pour l'opération de base. Pendant ce temps, en dehors d'Ubuntu, locale-genn'accepte aucun argument, c'est pourquoi aucun des «correctifs» qui l'utilisent ne fonctionne par exemple sur Debian. Ubuntu a corrigé locale-genpour accepter une liste de paramètres régionaux à générer mais le correctif pour le moment n'a pas été accepté dans Debian ou ailleurs.


1
Cela n'a pas fonctionné pour moi sur une image Ubuntu. Cette réponse a fonctionné cependant.
dialex

4
Pouvez-vous donner des détails? C.UTF-8est disponible sur tous les systèmes sans la nécessité d'installer quoi que ce soit, et il devrait être la plupart du temps suffisant.
andrewsh

Fonctionne avec l'image Docker ubuntu: 18.04. J'avais seulement besoin de "LANG". Je n'ai pas non plus besoin d'installer locales.
wisbucky

1
Si vous ne souhaitez définir cela qu'au moment de l'exécution, vous pouvez définir les variables d'environnement dans la docker runcommande args à la place: stackoverflow.com/questions/28405902/…
wisbucky

1
Sur Ubuntu, vous devez les installerapt-get install -y locales
gerardnico le

27

En fait, j'ai souffert du même problème, mais aucune des réponses fournies ne fonctionne à 100% avec debian: latest, même si elles fournissent de bons indices.

La plus grande différence est que vous devez vous assurer que les locales et locales-all sont installées, ces dernières contenant déjà en_US.UTF-8, vous n'avez donc pas à le générer avec local-gen ou dpkg-reconfigure .

Voici ce que j'ai fait dans mon Dockerfile pour le faire fonctionner:

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 description du package locales-all comprend: Ce package contient les données de paramètres régionaux précompilés pour tous les paramètres régionaux pris en charge. Une meilleure alternative est d'installer le package locales et de ne sélectionner que les paramètres régionaux souhaités, mais cela peut être utile sur une machine à faible mémoire car certains fichiers de paramètres régionaux nécessitent beaucoup de mémoire pour être compilés.
user2707671

E: Le package 'locales-all' n'a pas de candidat à l'installation
AstraSerg

@AstraSerg: Je suis très surpris que vous ayez cette erreur. Quel est le résultat apt-cache show locales-all? C'est définitivement un paquet officiel et disponible dans Debian.
Jean

@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Impossible de sélectionner les versions du paquet 'locales-all' car il est purement virtuel N: Aucun paquet trouvé Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: En fait, je ne sais pas pour Ubuntu car j'ai essayé cela pour Debian uniquement (voir FROM debian: dernier dans l'extrait Dockerfile que j'ai fourni).
Jean

19

Spécifiez les variables d'environnement LANGet LC_ALLà l'aide de -elors de l'exécution de votre commande:

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

Il n'est pas nécessaire de modifier le Dockerfile.


2
Les -earguments fonctionnent aussi avec docker-compose, d'ailleurs.
Dag Høidahl du

5
Cela fonctionne car la plupart des distributions incluent les C.UTF-8paramètres régionaux. Ils n'incluent généralement pas les paramètres régionaux spécifiques à une langue (par exemple en_US.UTF-8). Pour cela, vous devez installer locales-all(gros) ou installer localeset exécuter locale-genaprès la fin /etc/locale.gen.
Jonathon Reinhart

5

Conseil: parcourez les forums de documentation sur les conteneurs, comme le Forum Docker .

Voici une solution pour debian et ubuntu , ajoutez ce qui suit à votre 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

Vous n'avez pas besoin de ces choses complexes pour définir les paramètres régionaux sur Ubuntu / Debian. Tu n'as même pas besoin/etc/local.gen fichier.

Tout simplement locale-genfera tout et l'auteur n'a manqué que le localespaquet.

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

J'ai trouvé cela le plus simple et le plus efficace. Je confirme que cela fonctionne sur Ubuntu 16.04.


2

Réponse de @ Mixel a très bien fonctionné pour l'image de docker basée sur Ubuntu que nous avons.

Cependant, nous avons également une image docker basée sur centos pour tester des recettes via chef (en utilisant le kitchen-dockerpilote). L'un des packages que nous préinstallons n'a pas pu être installé en raison de l'absence de paramètres régionaux. Afin d'obtenir une locale installée, j'ai dû exécuter ce qui suit:

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

J'ai obtenu cette information de cette réponse sur ServerFault .

Après avoir exécuté les commandes ci-dessus dans le cadre du provisionnement du docker, le package est installé sans aucune erreur. De .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

Je n'aime pas avoir des variables d'environnement Docker lorsque je ne m'attends pas à ce que l'utilisateur d'une image Docker les modifie.

Mettez-le quelque part dans un RUN. Si vous n'avez pas généré de paramètres régionaux UTF-8, vous pouvez exécuter l'ensemble de commandes suivant:

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

Cela semblait être la seule réponse sensée ici car cela évite de se foutre de variables d'environnement. Cependant cela ne fonctionne pas. localela sortie n'est pas modifiée lors de l'exécution des commandes suivantes, ni lors de l'exécution des RUNblocs suivants , ni lors de la construction d'une autre image en utilisant l'image courante comme base. Peut-être qu'une action supplémentaire est nécessaire pour appliquer réellement ces changements?
user7860670

Les commandes ci-dessus vous permettent de générer des paramètres régionaux si vous les manquez. Si vous souhaitez les utiliser, vous devez le définir comme variable d'environnement. Ou, comme je le propose dans cette réponse directement juste à l'intérieur de RUN, ou en définissant Docker ENVcomme ENV LC_ALL=en_US.UTF-8.
Mitar le

-1

Plutôt que de réinitialiser les paramètres régionaux après l'installation du package locales, vous pouvez répondre aux questions qui vous seraient normalement posées (ce qui est désactivé par noninteractive) avant d'installer le package afin que les scripts du package configurent correctement les paramètres régionaux, cet exemple définit les paramètres régionaux sur anglais ( Britannique, 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

Pour moi, ce qui a fonctionné dans l' image 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

J'ai utilisé ceci (après 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! 👌')"

Et il s'imprime UTF8 works nice! 👌correctement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.