Como configurar códigos de idioma para Unicode em um contêiner do Docker Ubuntu 14.04?


30

Instalei um contêiner Ubuntu Trusty usando o Docker e, quando me conecto, vejo que o código do idioma está definido como 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=

Preciso usar um código de idioma Unicode (por exemplo, o inglês dos EUA en_US.UTF-8).

Eu tentei editar o arquivo / etc / default / locale e colocar isso dentro:

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

Mas mesmo depois de sair do contêiner e voltar, o código do idioma ainda não está definido corretamente.

Eu também tentei usar o update-localecomando, sem nenhum sucesso:

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=

Na minha configuração local, tenho a seguinte configuração:

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=

Como posso ter o mesmo no meu contêiner Docker?

Desde já, obrigado!

Respostas:


19

O /etc/default/localearquivo é carregado pelo PAM; veja /etc/pam.d/loginpor exemplo. No entanto, o PAM não é chamado ao executar um comando em um contêiner do Docker. Para configurar o código do idioma, basta definir a variável de ambiente relevante no seu Dockerfile. Exemplo:

FROM ubuntu:trusty
ENV LANG en_US.UTF-8
CMD ["/bin/bash"]

1
Funcionou! Obrigado pela explicação sobre o PAM também. No final, eu só preciso recriar a imagem (usando sudo docker build .) e ela funciona bem.
631 Pierre

53

Eu uso isso no meu 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

Pode-se também usar o 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'

2
Essa é a resposta correta. locale -amostra que o código do idioma foi removido completamente da imagem base. locale-gengera novamente e disponibiliza.
Abe Voelker

Onde fica isso dockerfile? Pode ser editado para a imagem baixada?
Mikhail Batcer 11/09/16

@MikhailBatcer, você pode criar um Dockerfileno diretório do projeto e usar a FROMdiretiva para estender uma imagem existente. Em seguida, basta anexar as linhas mencionadas. Saiba mais sobre o Dockerfile aqui
czerasz

3
Eu tenho o seguinte erro: locale-gen: not found. Solução: stackoverflow.com/a/39761477/1743367
JustAC0der 23/17

7

Experimentar

ENV LANG C.UTF-8

Se você receber o unsupported locale settingerro e não quiser instalar nenhum novo local.


Você também pode evitar a reconstrução da imagem para uma única corrida: docker-compose run --rm -e TERM=xterm -e LANG=C.UTF-8 worker bash
cmoran92

1

Eu tentei isso e me ajudou Dockerfiledepois que minha imagem eu adiciono

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

e corra

docker-compose build
docker-compose up -d
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.