Docker 镜像乱码的原因:

docker的镜像遵循最小化,很多命令都被阉割,localedef是绑定在 glibc-common 中的,阉割版的镜像中是没有这个命令的,我们需要重新安装glibc-common,然后下载自己需要的语言包,localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8。

localedef命令centos下使用,用途转化语言环境和字符集描述(charmap)源文件以生成语言环境数据库。

locale-gen命令ubuntu下使用。

第一次并未设置字符集,k8s集群pod日志中文乱码

FROM centos:centos7.9.2009

COPY ./jdk-8u321-linux-x64.rpm /tmp/
RUN yum update -y \
&& yum install telnet -y \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum install -y /tmp/jdk-8u321-linux-x64.rpm \
&& rm -rf /tmp/jdk-8u321-linux-x64.rpm \
&& yum clean all

第二次参考网上教程,依旧乱码

FROM centos:centos7.9.2009

RUN mkdir -p /home/dist/

ENV LANG C.UTF-8

COPY ["jdk-8u321-linux-x64.rpm","jmx.jar","jmx.yml","/home/dist/"]
RUN yum update -y \
&& yum install telnet -y \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum install -y /home/dist/jdk-8u321-linux-x64.rpm \
&& rm -rf /home/dist/jdk-8u321-linux-x64.rpm \
&& yum clean all

第三次自己凭经验写的,依旧乱码

FROM centos:centos7.9.2009

RUN mkdir -p /home/dist/

ENV LANG zh_CN.UTF-8

COPY ["jdk-8u321-linux-x64.rpm","jmx.jar","jmx.yml","/home/dist/"]
RUN yum update -y \
&& yum install telnet -y \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum install -y /home/dist/jdk-8u321-linux-x64.rpm \
&& rm -rf /home/dist/jdk-8u321-linux-x64.rpm \
&& yum clean all

最后一次,终于不乱码

FROM centos:centos7.9.2009

RUN mkdir -p /home/dist/


COPY ["jdk-8u321-linux-x64.rpm","jmx.jar","jmx.yml","/home/dist/"]
RUN yum update -y \
&& yum install telnet -y \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum install -y /home/dist/jdk-8u321-linux-x64.rpm \
&& rm -rf /home/dist/jdk-8u321-linux-x64.rpm \
&& yum install -y glibc-common \
&& localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 \
&& yum clean all

ENV LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_ALL=zh_CN.UTF-8

登录docker容器查看支持的语言包

[root@57a344fba00b /]# locale -a
C
en_US.utf8
POSIX
zh_CN.utf8