Docker与国际化

也曾一度认为Docker跟国际化基本扯不上什么关系,直到近期发现了这个bug方体会到一叶障目,学海无涯。

 

问题如下,在使用Docker作为容器的系统中添加了一个名为非英文字符的组织名后,多处信息提示中都出现了该组织名的乱码形式,如下图所示。

 

看到该问题,我的第一反应是JsonEncoding出了问题,并果(wǔ)断提出了可行(miù wù)的解决方案。

JsonGenerator generator = MAPPER.getFactory().createGenerator(writer, JsonEncoding.UTF8)

殊不知改方案完全的打偏了方向……真凶其实是Docker中的locale设置。在开发系统中,通常在安装过程中通过GUI正确设置语言环境。在Docker容器中,通常未设置系统区域设置,默认使用的locale为POSIX,因不支持unicode,这将直接导致后续国际化开发工作危机四伏。

$ locale
...
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
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=
...

以下操作才是正确的打开方式。

RUN apt-get update
RUN 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 && \locale-gen
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en

在本例中,首先在gradle文件中

import com.bmuschko.gradle.docker.tasks.image.Dockerfile

随后添加环境变量

environmentVariable "LANG", "en_US.UTF-8"
environmentVariable "LANGUAGE", "en_US:en"
environmentVariable "LC_ALL", "en_US.UTF-8"

至此问题解决。纸上得来终觉浅,原知此事要躬行。与诸君共勉!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部