核心是设对环境变量并装好语言包:一用c.utf-8编码(debian/ubuntu和alpine均适用);二按需生成zh_cn.utf-8 locale(仅debian/ubuntu需安装locales并locale-gen);三仅图形渲染场景才需安装中文字体;四java应用须额外指定-dfile.encoding=utf-8。

核心就两点:设对环境变量,装好语言包。光改 LANG 不装 locale 数据,或者只装字体不配编码,都会半途而废。
一、统一用 UTF-8 编码环境变量
无论基础镜像是 Debian/Ubuntu 还是 Alpine,第一步必须明确声明字符集。推荐使用 C.UTF-8——它轻量、无需生成额外 locale 文件,且被绝大多数应用(包括 Java、Python、Nginx)原生支持。
- Debian/Ubuntu 系列:在 Dockerfile 开头添加
ENV LC_ALL=C.UTF-8
- Alpine 系列:同样写这两行即可,无需额外安装 locales 包(Alpine 默认已内置 C.UTF-8)
二、按需安装中文 locale 支持(非必需但更稳妥)
如果应用显式依赖 zh_CN.UTF-8(比如某些老版本 Tomcat 或 Spring Boot 配置),就得真正生成该 locale。注意:这步只对 Debian/Ubuntu 有效,Alpine 不适用。
- 先安装 locales 工具
- 启用并生成 zh_CN.UTF-8
- 再设置环境变量(覆盖前面的 C.UTF-8)
ENV LC_ALL=zh_CN.UTF-8
三、补充中文字体(仅当涉及图形渲染时需要)
日志乱码、控制台输出乱码、文件名乱码——这些跟字体无关,只和 locale 与编码有关。只有当你容器里跑的是 Web 页面、PDF 生成、图表绘制等需要“显示汉字字形”的场景,才需加字体。
- Debian/Ubuntu:安装开源中文字体(推荐文泉驿)
RUN fc-cache -fv
- Alpine:安装 ttf-dejavu 或手动 COPY 字体后刷新
四、Java 应用额外加固(防 JVM 层乱码)
Docker 环境变量设好了,JVM 还可能按自己的逻辑选编码。建议在启动命令中强制指定:
CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "app.jar"]或在 ENTRYPOINT 脚本中加入:
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"











