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



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

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

我试过了:

locale-gen nb_NO.UTF-8

但没有任何改变。如何在 Docker 容器中设置区域设置和键盘?

在你的 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

这是从关于该主题的非常好的帖子中提取的,来自

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

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

这个答案对我帮助很大。

只需添加

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

到你的 Docker 文件中。(您可能需要确保已安装locales包。基本操作不需要任何其他内容。同时,在 Ubuntu 之外,locale-gen不接受任何争论,这就是为什么使用它的"修复"都不起作用的原因,例如在 Debian 上。Ubuntu 已经修补了locale-gen以接受要生成的语言环境列表,但目前该补丁尚未在其他任何地方的 Debian 中被接受。

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

最大的区别是,您应该确保同时安装了区域设置区域设置,后者已经包含en_US。UTF-8,因此您不必使用本地生成dpkg 重新配置生成它。

以下是我在 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

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

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

没有必要修改 Dockerfile。

你们不需要那些复杂的东西来设置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。

提示:浏览容器文档论坛,如 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
当我

不希望 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

我使用了这个(在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! 👌

>@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

添加到"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

享受它!

适用于 ubuntu 14.04,其中/etc/locale.gen 中没有文件,但它/etc/default/locale共享文件。所以对于 trusty(ubuntu 14.04(,只需运行

RUN apt-get -y install locales && 
     update-locale LANG=en_US.UTF-8

这样至少全局默认区域设置从烦人的"POSIX"更改为您想要的区域设置。

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

在 Debian 中,我不得不...

1 - 编辑区域设置文件

sudo nano /etc/default/locale

2 - 取消注释我想在"es_ES"的情况下使用的区域设置。UTF-8 UTF-8">

3 - 运行:

sudo locale-gen

希望这能为那些在 Debian 中遇到这个问题的人节省时间。

您可以使用命令和 args 来安装语言环境,设置默认语言环境,然后运行/docker_entry.sh:

使用/

bin/bash 作为命令,使用整个脚本作为参数。

安装所有语言环境的示例(注意建议,指定您需要哪些语言环境(

命令

["/bin/bash", "-c"]

参数

|
 apt-get update && apt-get install -y locales && sed -i 's/^# \(.*\)/\1/' /etc/locale.gen && locale-gen;
export LANG=en_US.UTF-8;
export LC_ALL=en_US.UTF-8;
/docker-entrypoint.sh

我在 ubuntu 容器中设置语言环境时遇到问题。它不是从/etc/default/locale读到的.我得到:

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME=C.UTF-8
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=

因此,我locale设置为系统环境变量。登录时将读取。源

所以,我所做的是设定

sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

sudo nano /etc/profile.d/set-locale.sh

export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
export LC_ALL=en_US.UTF-8

现在我locale是:

LANG=en_US.UTF-8
LANGUAGE=en
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=en_US.UTF-8

这对我来说很有用,尝试在没有自定义Dockerfile的情况下向postgres:13.2容器添加额外的语言环境。我首先尝试了使用命名语言环境运行locale-gen的方法(例如 locale-gen sv_FI.UTF-8 (,但这似乎对我有用(在这种情况下,图像是基于 Debian Buster 的(。它用空的区域设置列表覆盖区域设置数据库,从而中断 Postgres 启动。

不过,这对我来说效果很好。在这种情况下,您需要添加默认en_US.UTF-8区域设置自定义区域设置,因为默认情况下/etc/locale.gen禁用所有区域设置。

这是我docker-compose.yml文件的摘录:

entrypoint:
  - /bin/sh
  - -c
  - sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen &&
      sed -i -e 's/# sv_FI.UTF-8 UTF-8/sv_FI.UTF-8 UTF-8/' /etc/locale.gen &&
      locale-gen &&
      docker-entrypoint.sh postgres
对我来说,

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

最新更新