如何在Debian / Ubuntu Docker容器内设置语言环境?


124

我正在运行一个Ubuntu Docker容器。我有挪威语键盘,需要使用挪威语字符(øæå)。

我的终端字符编码设置为UTF-8,我使用SSH连接到我的容器。但是,我无法键入挪威字符,也无法复制和粘贴挪威字符,也无法使用CTL + SHIFT + U + 00f8。

我试过了:

locale-gen nb_NO.UTF-8

但没有改变。如何在Docker容器中设置语言环境和键盘?

Answers:


172

将Dockerfile改编自

# 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     

这摘自该主题的非常好的帖子,从

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


1
当您使用debian:jessie作为基本容器时,它不起作用
iDexter

22
您需要apt-get -y install locales在使用Ubuntu时使用
user2915097 '18

2
为了避免出现致命文件找不到错误,我不得不RUN touch /usr/share/locale/locale.alias在调用之前添加locale-gen
Paul Keister

6
sed脚本有点笨拙。尝试s/# \(en_US\.UTF-8 .*\)/\1/通过捕获它来避免在替换字符串中重复搜索短语。
三点

3
如果你想避免产生额外的层,你可以写ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
安德烈Ravazzi

100

使用Debian的用户还必须安装locales软件包。

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 

这个答案对我很有帮助。


63

只需添加

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

到您的Dockerfile中。(您可能需要确保locales已安装该软件包。)基本操作不需要任何其他操作。同时,在Ubuntu之外,locale-gen不接受任何参数,这就是为什么使用它的所有“修补程序”都无法工作的原因,例如在Debian上。Ubuntu 已打补丁locale-gen以接受要生成的语言环境列表,但此补丁目前尚未在其他任何地方的Debian中接受。


1
在Ubuntu映像上对我不起作用。这个答案虽然有效。
Dialex '17

4
您能提供任何细节吗?C.UTF-8无需安装任何软件即可在所有系统上使用,并且大多数情况下就足够了。
andrewsh

适用于Docker ubuntu:18.04映像。我只需要“ LANG”。我也不需要安装locales
wisbucky

1
如果只想在运行时进行设置,则可以在docker run命令args中设置env vars :stackoverflow.com/questions/28405902/…–
wisbucky

1
在Ubuntu上,您需要安装它们apt-get install -y locales
gerardnico

27

实际上,我碰巧遇到了同样的问题,但是即使提供了很好的提示,提供的答案也没有100%使用debian:latest。

最大的区别是,您应该确保同时安装了语言环境 语言环境-所有语言环境,后者已经包含en_US.UTF-8,因此您不必使用local-gendpkg-reconfigure生成它。

这是我在Dockerfile中完成的工作:

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
locales-all软件包的说明包括:该软件包包含所有受支持语言环境的预编译语言环境数据。更好的替代方法是安装语言环境软件包,并仅选择所需的语言环境,但由于某些语言环境文件需要占用大量内存来进行编译,因此它在低内存计算机上很有用。
user2707671

E:“ locales-all”软件包没有安装候选软件
AstraSerg

@AstraSerg:我很惊讶您遇到了这个错误。输出的是apt-cache show locales-all多少?它绝对仍然是官方软件包,并且在Debian中可用。
Jean

@ Jean root @ share:/#apt-cache显示语言环境-所有; cat / etc / issue N:不能从软件包“ locales-all”中选择版本,因为它完全是虚拟的N:找不到软件包Ubuntu 18.04.1 LTS \ n \ l
AstraSerg '18

@AstraSerg:实际上我不知道Ubuntu,因为我只尝试了Debian(请参阅我提供的Dockerfile片段中的FROM debian:latest)。
吉恩(Jean)

19

在运行命令时指定LANGLC_ALL环境变量-e

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

无需修改Dockerfile。


2
-e顺便说一下,这些参数也可以与docker-compose一起使用。
DagHøidahl'18

5
之所以可行,是因为大多数发行版都包含C.UTF-8区域设置。它们通常不包含特定于语言的语言环境(例如en_US.UTF-8)。为此,您需要ot install locales-all(大)或在end之后安装locales并运行。locale-gen/etc/locale.gen
乔纳森·莱因哈特


3

你们不需要那些复杂的事情就可以在Ubuntu / Debian上设置语言环境。您甚至不需要/etc/local.gen文件。

只需locale-gen要做所有事情,而作者只错过了locales软件包。

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

我发现这是最简单,最有效的。我确认它可以在Ubuntu 16.04上运行。


2

@Mixel的答案非常适合我们拥有的基于Ubuntu的Docker映像。

但是,我们还有一个基于centos的docker映像,用于通过Chef(使用kitchen-docker驱动程序)测试配方。我们未预安装的软件包之一由于未设置语言环境而无法安装。为了安装语言环境,我必须运行以下命令:

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

我从ServerFault的答案中获得了此信息。

在将以上命令作为docker的一部分运行后,预配了已安装的软件包,没有任何错误。来自.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

当我不希望Docker映像的用户更改它们时,我不喜欢使用Docker环境变量。

只要把它放在一个地方RUN。如果没有生成UTF-8语言环境,则可以执行以下命令集:

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

这似乎是这里唯一明智的答案,因为它避免了与环境变量混淆。但是,它不起作用。locale当执行后续命令,执行后续RUN块或以当前映像为基础构建另一个映像时,输出不会更改。可能需要采取一些其他措施才能真正应用这些更改?
user7860670

上面的命令是您丢失语言环境时如何生成它们的方法。如果要使用它们,则必须将其设置为环境变量。或者,因为我在这个答案建议直接刚内运行的,或者,通过设置泊坞ENV一样ENV LC_ALL=en_US.UTF-8
Mitar

-1

您可以回答noninteractive在安装软件包之前通常会被问到的问题(由禁用),而不是在安装locales软件包后重置语言环境,以便软件包脚本正确设置语言环境,此示例将语言环境设置为英语(英国,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

对我来说,在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

我使用了这个(在之后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! 👌')"

并且可以UTF8 works nice! 👌正确打印。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.