如何在Debian/Ubuntu的Docker容器中设置区域设置?

207

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

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

我尝试过:

locale-gen nb_NO.UTF-8

但是什么也没有改变。我该如何在 Docker 容器内设置语言环境和键盘布局?

18个回答

293
在你的Dockerfile中加入一些从中适应的内容。
# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8     

如果你使用的是Debian或Ubuntu,你还需要安装locales来使用locale-gen。
apt-get -y install locales

这是从那个主题上非常好的帖子中提取出来的。

https://web.archive.org/web/20230323021946/http://jaredmarkell.com/docker-and-locales/


28
在使用Ubuntu时,您需要运行apt-get -y install locales命令安装语言环境。 - user2915097
4
为了避免致命的文件未找到错误,我不得不在调用 locale-gen 前添加 RUN touch /usr/share/locale/locale.alias - Paul Keister
8
这个 sed 脚本有些笨重。尝试使用 s/# \(en_US\.UTF-8 .*\)/\1/,通过捕获搜索短语来避免在替换字符串中重复使用它。 - tripleee
11
如果你想避免创建额外的层级,你可以写成 ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8 - Andre Ravazzi
4
根据 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 中的文档,ENV 不会创建额外的层级。因此,您可以放心使用多个 ENV 命令而不会出现问题。 - borievka
显示剩余7条评论

132

使用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 

这个答案对我有很大帮助。


95
只需添加。
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

将以下内容添加到您的Dockerfile中。(您可能需要确保已安装locales包。)对于基本操作,不需要其他内容。 与此同时,在Ubuntu之外,locale-gen不接受任何参数,这就是为什么在Debian等系统上使用它的任何“修复”都不起作用的原因。Ubuntu已经修补了locale-gen以接受要生成的语言环境列表,但该补丁目前尚未被Debian或其他任何地方接受。


2
在Ubuntu镜像上对我没用。不过这个答案有效。 - dialex
5
请提供更多细节信息?C.UTF-8 在所有系统上都可用,无需安装任何东西,而且它应该大部分够用。 - andrewsh
3
适用于 Docker ubuntu:18.04 镜像。我只需要 "LANG"。我不需要安装 locales - wisbucky
1
如果您只想在运行时设置此项,可以在 docker run 命令参数中设置环境变量:https://dev59.com/p14c5IYBdhLWcg3wCGVJ#52004330 - wisbucky
1
在Ubuntu上,您需要安装它们apt-get install -y locales - gerardnico
一行代码:ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 - Константин Ван

41

我刚好也遇到了同样的问题,但是所提供的答案都不是针对debian:latest完全有效,即使它们提供了很好的提示。

最大的区别在于,您应该确保安装了localeslocales-all,后者已经包含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

3
locales-all软件包的描述是:该软件包包含所有支持的语言环境的预编译语言环境数据。更好的选择是安装locales软件包并仅选择所需的语言环境,但在低内存计算机上,locales-all也可能很有用,因为某些语言环境文件需要大量内存来进行编译。 - user2707671
E: 软件包 'locales-all' 没有安装候选项。 - AstraSerg
@AstraSerg:我非常惊讶你会遇到那个错误。apt-cache show locales-all 的输出是什么?它绝对还是一个官方包,在 Debian 中也是可用的。 - Jean
@Jean root@share:/# apt-cache show locales-all; cat /etc/issue 无法从“locales-all”软件包中选择版本,因为它是纯虚拟的 未找到任何软件包 Ubuntu 18.04.1 LTS \n \l - AstraSerg
@AstraSerg:实际上我不知道Ubuntu,因为我只在Debian上尝试过(请参见我提供的Dockerfile片段中的FROM debian:latest)。 - Jean

29

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

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

不需要修改Dockerfile文件。


3
顺便提一下,-e 参数也适用于 docker-compose。 - Dag Høidahl
9
这个方法可行是因为大多数发行版都包含了C.UTF-8语言环境,但通常不会包括特定语言的语言环境(例如en_US.UTF-8)。如果需要这些语言环境,则需要安装locales-all(比较大),或者安装locales并在编辑完/etc/locale.gen文件后运行locale-gen命令。 - Jonathon Reinhart

7
你们不需要使用复杂的方法在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上可以使用。

这对我来说不起作用,在一个基于Debian Buster的镜像上。有关更多细节和有效方法,请访问:https://dev59.com/p14c5IYBdhLWcg3wCGVJ#76480234 - Per Lundberg
这对我来说很适用,使用一个基于Ubuntu的镜像。 - Izkata

7
提示:浏览容器文档论坛,例如Docker论坛
这里有一个适用于Debian和Ubuntu的解决方案,将以下内容添加到您的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

6
我不喜欢在预期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

1
这似乎是唯一明智的答案,因为它避免了与环境变量的干扰。然而,它并不起作用。当执行后续命令时,locale输出没有改变,也没有在执行后续RUN块或使用当前镜像作为基础构建另一个镜像时改变。也许需要采取其他措施来实际应用这些更改? - user7860670
以上命令是用于生成本地化环境的,如果您缺少它们,可以使用这些命令。如果您想要使用它们,您必须将其设置为环境变量。或者,如我在此答案中所建议的那样,在RUN内直接设置,或通过设置Docker ENV,例如 ENV LC_ALL=en_US.UTF-8 - Mitar

4

我在执行 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 表现良好!


1
对我来说,仅设置 LANGLC_ALL 就足以使 Python 输出 UTF-8。我意识到这三个都列在 locale 命令中,但实际上可能并不需要。我不确定。我还没有深入研究过 locale。 - erwin
1
这是唯一提到Ubuntu的“language-pack-*”软件包的答案,您需要添加这些软件包以便为许多Linux实用工具提供翻译。其他答案对于Debian也有效,但在没有“language-pack-es”的Ubuntu上,“gpg --help”(例如)将以英语而不是西班牙语显示。 - Dan

2
将以下内容添加到"Dockerfile"中:
# Set the locale in container
RUN apt-get -y install locales
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

享受它!


2
它可以与docker postgres 12.7一起使用。顺便提一下,无需设置这些ENV变量,在前两个RUN命令中就足够了(即使在某些发行版中已经安装了locales软件包)。 - Edenshaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接