¿Cómo configurar la configuración regional dentro de un contenedor Docker de Debian / Ubuntu?

124

Estoy ejecutando un contenedor de Ubuntu Docker. Tengo un teclado noruego y necesito usar caracteres noruegos (øæå).

La codificación de caracteres de mi terminal está configurada en UTF-8 y estoy conectado a mi contenedor usando SSH. Sin embargo, no puedo escribir caracteres noruegos, ni copiar y pegar caracteres noruegos, ni usar CTL + SHIFT + U + 00f8.

Lo intenté:

locale-gen nb_NO.UTF-8

pero nada cambió. ¿Cómo configuro la configuración regional y el teclado dentro de un contenedor Docker?

mtmacdonald
fuente

Respuestas:

172

Pon en tu Dockerfile algo adaptado 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     

esto se extrae de la muy buena publicación sobre ese tema, de

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

usuario2915097
fuente
1
No funciona cuando usas debian: jessie como contenedor base
iDexter
22
lo necesita apt-get -y install localescuando usa Ubuntu
user2915097
2
Tuve que agregar RUN touch /usr/share/locale/locale.aliasantes de la llamada a locale-genpara evitar un error fatal de archivo no encontrado
Paul Keister
6
El sedguión es un poco torpe. Intente s/# \(en_US\.UTF-8 .*\)/\1/evitar repetir la frase de búsqueda en la cadena de reemplazo capturándola.
tripleee
3
Si desea evitar la creación de capas adicionales, puede escribirENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi
100

Aquellos que usan Debian también deben instalar el localespaquete.

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 

Esta respuesta me ayudó mucho.

mixel
fuente
63

Solo agrega

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

en su Dockerfile. (Es posible que deba asegurarse de que el localespaquete esté instalado). No se necesita nada más para la operación básica. Mientras tanto, fuera de Ubuntu, locale-genno acepta ningún argumento, es por eso que ninguna de las 'correcciones' que lo usan funciona, por ejemplo, en Debian. Ubuntu ha parcheado locale-genpara aceptar una lista de configuraciones regionales para generar, pero el parche en este momento no ha sido aceptado en Debian ni en ningún otro lugar.

andrewsh
fuente
1
No funcionó para mí en una imagen de Ubuntu. Sin embargo, esta respuesta funcionó.
dialex
4
¿Podría darnos algún detalle? C.UTF-8está disponible en todos los sistemas sin la necesidad de instalar nada, y debe ser en su mayoría suficiente.
andrewsh
Funciona con Docker ubuntu: imagen 18.04. Solo necesitaba "LANG". Yo tampoco necesitaba instalar locales.
wisbucky
1
Si solo desea configurar esto en tiempo de ejecución, puede configurar env vars en el docker runcomando args en su lugar: stackoverflow.com/questions/28405902/…
wisbucky
1
En Ubuntu, necesitas instalarlosapt-get install -y locales
gerardnico
27

De hecho, he sufrido el mismo problema, pero ninguna de las respuestas proporcionadas funciona al 100% con debian: latest, incluso si proporcionan buenas pistas.

La mayor diferencia es que debe asegurarse de que tanto locales como locales-all estén instalados, este último ya contiene en_US.UTF-8, por lo que no tiene que generarlo con local-gen o dpkg-reconfigure .

Esto es lo que hice en mi Dockerfile para que funcione:

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
Vaquero
fuente
2
La descripción del paquete locales-all tiene: Este paquete contiene los datos de configuración regional precompilados para todas las configuraciones regionales admitidas. Una mejor alternativa es instalar el paquete de locales y seleccionar solo los locales deseados, pero puede ser útil en una máquina con poca memoria porque algunos archivos de local requieren mucha memoria para ser compilados.
user2707671
E: El paquete 'locales-all' no tiene candidato de instalación
AstraSerg
@AstraSerg: Me sorprende mucho que hayas recibido ese error. ¿De qué es la salida apt-cache show locales-all? Definitivamente sigue siendo un paquete oficial y está disponible en Debian.
Jean
@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: No se pueden seleccionar versiones del paquete 'locales-all' ya que es puramente virtual N: No se encontraron paquetes Ubuntu 18.04.1 LTS \ n \ l
AstraSerg
@AstraSerg: en realidad, no lo sé para Ubuntu, ya que lo intenté solo para Debian (consulte FROM debian: lo último en el fragmento de Dockerfile que proporcioné).
Jean
19

Especifique las variables de entorno LANGy LC_ALLutilizando -eal ejecutar su comando:

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

No es necesario modificar el Dockerfile.

Dag Høidahl
fuente
2
Por -ecierto, los argumentos también funcionan con docker-compose.
Dag Høidahl
5
Esto funciona porque la mayoría de las distribuciones incluyen la C.UTF-8configuración regional. Por lo general, no incluyen configuraciones regionales específicas del idioma (p en_US.UTF-8. Ej .). Para eso, necesita instalar locales-all(grande) o instalar localesy ejecutar locale-gendespués de finalizar /etc/locale.gen.
Jonathon Reinhart
5

Consejo: Explore los foros de documentación de contenedores, como el Foro de Docker .

Aquí hay una solución para debian y ubuntu , agregue lo siguiente a su 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
Eduardo Santana
fuente
3

Ustedes no necesitan esas cosas complejas para establecer configuraciones regionales en Ubuntu / Debian. Ni siquiera necesitas/etc/local.gen archivo.

Simplemente locale-genhará todo y el autor solo perdió el localespaquete.

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

Encontré este el más simple y el más efectivo. Confirmo que funciona en Ubuntu 16.04.

Bumsik Kim
fuente
2

La respuesta de @ Mixel funcionó muy bien para la imagen de la ventana acoplable basada en Ubuntu que tenemos.

Sin embargo, también tenemos una imagen de ventana acoplable basada en centos para probar recetas a través del chef (usando el kitchen-dockercontrolador). Uno de los paquetes que preinstalamos no se pudo instalar debido a que no se estableció ninguna configuración regional. Para instalar una configuración regional, tuve que ejecutar lo siguiente:

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

Obtuve esta información de esta respuesta en ServerFault .

Después de ejecutar los comandos anteriores como parte de la ventana acoplable, el paquete se instaló sin errores. 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
E. Moffat
fuente
1

No me gusta tener variables de entorno de Docker cuando no espero que el usuario de una imagen de Docker las cambie.

Ponlo en algún lugar de uno RUN. Si no ha generado configuraciones regionales UTF-8, puede realizar el siguiente conjunto de comandos:

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
Mitar
fuente
Esta parecía ser la única respuesta sana aquí porque evita meterse con las variables de entorno. Sin embargo, no funciona. localela salida no cambia cuando se ejecutan comandos subsiguientes, ni cuando se ejecutan RUNbloques subsiguientes , ni cuando se construye otra imagen usando la imagen actual como base. ¿Quizás se requiera alguna acción adicional para aplicar estos cambios?
user7860670
Los comandos anteriores son la forma de generar locales si los faltan. Si desea usarlos, debe configurarlo como variable de entorno. O, como propongo en esta respuesta, directamente dentro de RUN, o, configurando Docker ENVcomo ENV LC_ALL=en_US.UTF-8.
Mitar
-1

En lugar de restablecer la configuración regional después de la instalación del noninteractivepaquete de configuraciones regionales, puede responder las preguntas que normalmente se le hacen (que están deshabilitadas por ) antes de instalar el paquete para que los scripts del paquete configuren la configuración regional correctamente, este ejemplo establece la configuración regional en inglés ( Británico, 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/*
Matthew Buckett
fuente
-1

Para mí, lo que funcionó en la imagen de 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
alexopoulos7
fuente
-1

Usé esto (despué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! 👌')"

E imprime UTF8 works nice! 👌correctamente.

Carlos Pinzón
fuente