¿Cómo configurar configuraciones regionales para Unicode en un contenedor Docker Ubuntu 14.04?

30

Instalé un contenedor Ubuntu Trusty usando Docker, y cuando me conecto a él, puedo ver que la configuración regional está configurada al mínimo:

sudo docker run -i -t <id> /bin/bash
root@<id>:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Necesito usar una configuración regional Unicode (por ejemplo, la de inglés de EE. UU en_US.UTF-8.).

Intenté editar el archivo / etc / default / locale y poner esto dentro:

# cat /etc/default/locale 
LANG=en_US.UTF-8

Pero incluso después de abandonar el contenedor y volver, la configuración regional todavía no está configurada correctamente.

También intenté usar el update-localecomando, sin ningún éxito:

root@cab13a6abe4f:/# update-locale LANG=en_US.UTF-8
root@cab13a6abe4f:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

En mi configuración local, tengo la siguiente configuración:

LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

¿Cómo puedo tener lo mismo en mi contenedor Docker?

¡Gracias por adelantado!

Pierre
fuente

Respuestas:

19

El /etc/default/localearchivo es cargado por PAM; ver /etc/pam.d/loginpor ejemplo. Sin embargo, PAM no se invoca cuando se ejecuta un comando en un contenedor Docker. Para configurar la configuración regional, simplemente configure la variable de entorno relevante en su Dockerfile. Ejemplo:

FROM ubuntu:trusty
ENV LANG en_US.UTF-8
CMD ["/bin/bash"]
Andreas Veithen
fuente
1
¡Funcionó! Gracias por la explicación sobre PAM también. Al final, solo necesito reconstruir la imagen (usando sudo docker build .) y funciona bien.
Pierre
53

Yo uso esto en mi Dockerfile:

# Set the locale
RUN locale-gen en_US.UTF-8  
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

También se puede usar el ENVone-liner:

RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
czerasz
fuente
2
Esta es la respuesta correcta. locale -amuestra que la configuración regional se ha eliminado por completo de la imagen base. locale-genlo genera de nuevo y lo pone a disposición.
Abe Voelker
¿Dónde es esto dockerfile? ¿Se puede editar para la imagen descargada?
Mikhail Batcer
@MikhailBatcer puede crear un Dockerfileen el directorio de su proyecto y utilizar la FROMdirectiva para ampliar una imagen existente. Luego solo agregue las líneas mencionadas. Encuentre más sobre el Dockerfile aquí
czerasz
3
Tengo el siguiente error: locale-gen: not found. Solución: stackoverflow.com/a/39761477/1743367
JustAC0der
7

Tratar

ENV LANG C.UTF-8

Si recibe el unsupported locale settingerror y no desea instalar ninguna nueva configuración regional.

e18r
fuente
También puede evitar reconstruir la imagen para una sola ejecución: docker-compose run --rm -e TERM=xterm -e LANG=C.UTF-8 worker bash
cmoran92
1

Intenté esto y me ayudó Dockerfiledespués de mi imagen agregué

ENV LANG='en_GB.UTF-8' LANGUAGE='en_GB:en' LC_ALL='en_GB.UTF-8'
RUN echo en_GB.UTF-8 UTF-8 >> /etc/locale.gen && locale-gen

y correr

docker-compose build
docker-compose up -d
Jogi
fuente