如何手动正确设置区域设置?

如何手动正确设置区域设置?

我正在构建一个 docker 映像,Ubuntu 14.04 但在正确设置区域设置时遇到了麻烦。

(我知道 14.04 已经 EOL,但它应该仍然可以工作,对吗?我在 askubuntu.com 上被拒绝接受 Ubuntu 人员的支持,因此我在这里碰碰运气)

我的Dockerfile样子:

COPY .bashrc /root/.bashrc
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y build-essential \
                       locales
RUN dpkg-reconfigure locales
WORKDIR /home/prs/

哪里.bashrc

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

它将构建没有错误docker build -t "test" .,但当我运行它时,我得到以下输出:

$ docker run -it test
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
root@d09247a538eb:/# source /root/.bashrc 
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@d09247a538eb:/# 

我也尝试过:

echo "LANG=en_US.UTF-8" > /etc/locale.conf

我仍然得到:

# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

这是怎么回事?以及如何正确设置区域设置?

更新:

看起来,如果我的容器映像基于Ubuntu 18.04,我可以locale在键入时选择 a # dpkg-reconfigure locales,但使用14.04(这是我当前需要的)我会得到以下内容:

# dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US.UTF-8",
        LC_ALL = "en_US.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

正如 Eduardo Trápani (@EduardoTrápani) 下面建议的那样,我还尝试手动运行区域设置:

# echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
en_US.UTF-8 UTF-8
# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

locale-gen另一个提示可能是, locales/sup[ported.d 目录中没有任何内容(如果我从 http://manpages.ubuntu.com/manpages/precise/man8/locale- 正确理解这一点,这应该是结果)gen.8.html):

# ls -l /var/lib/locales/supported.d/  

总计 0

答案1

您看到的问题是,默认情况下,除了C(也称为POSIX)和C.UTF-8(UTF-8 版本)之外,Docker 容器中没有内置任何语言环境。这是因为 glibc 附带了大量的语言环境,这些语言环境占用了大量的空间,而 Debian 和 Ubuntu 为了节省空间,只在包中提供压缩版本locales,需要在系统上构建特定的语言环境。

如果您只是寻找使用 UTF-8 的英语语言环境,那么C.UTF-8可能会满足您的需求,并且无需在容器中构建新的语言环境。您可以简单地使用LC_ALL=C.UTF-8 docker run -it test.

但是,如果您特别需要美国英语语言环境(例如,因为某些奇怪的原因您确实喜欢 Avoirdupois 系统并希望将其与 一起使用LC_MEASUREMENT),那么最简单的解决方案是安装该locales-all软件包。这提供了所有语言环境的预构建版本。

或者,如果您急需空间,可以更新 Dockerfile 以添加以下行:

RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen

这将构建您想要的区域设置。

最终的解决方案是让您.bashrc检测您的区域设置是否有效,如果无效则将其设置为其他值。尽管我的母语是英语,但我经常使用法语区域设置,而法语区域设置并不总是在我使用的所有系统上可用,因此我采用了这种方法。您可以运行以下命令,如果区域$locale设置存在,则该命令将以 0 退出;如果不存在,则返回非零值:

$ perl -MPOSIX=locale_h -E 'exit !setlocale(LC_ALL, $ARGV[0]);' "$locale" \
  2>/dev/null

答案2

您应该将语言环境添加到/etc/locale.gen,构建它,然后就可以使用它:

$ sudo echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
$ sudo locale-gen

您可以将这些命令放入 docker 文件中。

相关内容