我正在构建一个 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 文件中。