马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
容器里跑中文软件、打中文日志 、显示中文文件名,一不小心就变问号或者方块。根因很单一:容器镜像默认不带中文 locale。修起来也就两步——装语言包、把 LANG / LANGUAGE / LC_ALL 写进 shell 启动文件。本文把命令行方式和 Dockerfile 内构建方式各写一遍。
一、先看容器里到底有哪些语言
locale -a
Debian 系默认的 slim 镜像通常只有 C、C.utf8、POSIX 三样,看不到 zh_CN.utf8 就是缺中文环境。
二、装中文语言环境(两种方式)
方式一,直接装语言包:
apt-get install -y language-pack-zh-hans
方式二,装 locales 再生成:
apt-get install -y locales
echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
装完之后再跑一次 locale -a,应该能出现 zh_CN.utf8 了。
三、把环境变量写进 bash 启动文件
只装语言包不够,还要让登录 shell 默认带上中文配置。往 /etc/bash.bashrc 追加:
echo -e "\n# chinese zh_CN.UTF-8" >> /etc/bash.bashrc
echo -e "export LANG=\"zh_CN.UTF-8\"" >> /etc/bash.bashrc
echo -e "export LANGUAGE=\"zh_CN.UTF-8\"" >> /etc/bash.bashrc
echo -e "export LC_ALL=\"zh_CN.UTF-8\"" >> /etc/bash.bashrc
再往 /etc/profile 追加同样的四行(注意是 /etc/profile,别照抄时写成 /profile):
echo -e "\n# chinese zh_CN.UTF-8" >> /etc/profile
echo -e "export LANG=\"zh_CN.UTF-8\"" >> /etc/profile
echo -e "export LANGUAGE=\"zh_CN.UTF-8\"" >> /etc/profile
echo -e "export LC_ALL=\"zh_CN.UTF-8\"" >> /etc/profile
bash.bashrc 管交互式非登录 shell,profile 管登录 shell,两边都写才不会时好时坏。
四、重启容器
docker restart 容器名
注意 docker restart 后面要跟容器名或 id,只写 docker restart 是会报错的。
五、Dockerfile 里一次性搞定(推荐用于正式项目)
临时修容器每次都要重来一遍,正式做法是把配置写进镜像:
FROM debian:bookworm-slim
# 换国内镜像,DEB822 格式
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
# 更新系统
RUN apt -y update && apt -y upgrade
# 安装中文环境
RUN apt install -y locales && \
echo 'zh_CN.UTF-8 UTF-8' >> /etc/locale.gen && \
locale-gen
# 设置中文
RUN echo '\n# chinese zh_CN.UTF-8\n\
export LANG="zh_CN.UTF-8"\n\
export LANGUAGE="zh_CN.UTF-8"\n\
export LC_ALL="zh_CN.UTF-8"\n' >> /etc/bash.bashrc
RUN echo '\n# chinese zh_CN.UTF-8\n\
export LANG="zh_CN.UTF-8"\n\
export LANGUAGE="zh_CN.UTF-8"\n\
export LC_ALL="zh_CN.UTF-8"\n' >> /etc/profile
几个细节:镜像要换国内源,否则 apt 能卡十几分钟;locales 和语言包二选一即可,装了 language-pack 就不用再 locale-gen;sed 换成 DEB822 格式写法那行,在 Debian 12 / Ubuntu 24.04 上对应的是 .sources 文件,老教程里的 sources.list 写法在这两个版本上已经不生效。
六、验证与常见现象
- 中文文件名显示成问号:多半是挂载的宿主机目录本身编码就是 ASCII,或者挂载时没指定正确的编码。
- java 程序中文乱码:容器 locale 修好后还要确认 JVM 加了 -Dfile.encoding=UTF-8。
- MySQL 中文乱码:除了 locale,还要看字符集是 utf8mb4 还是 latin1。
- 交互 shell 有中文、脚本执行时没有:LC_ALL 没写进 profile,只写了 bash.bashrc。
七、三条经验
第一,容器构建阶段就把 locale 配好,别等运行后再进容器手改,改完一重建镜像全丢。第二,三方镜像(比如某些官方 image)经常缺语言包,不要去改别人的镜像,写个 Dockerfile 从它上面叠一层最省事。第三,LC_ALL 会强制覆盖 LANG,排障时先用 env | grep -i lang 看实际生效的是哪一档,比反复重装快。
qidao123.com企服评测-应用市场 编辑提示
|