Docker 容器(特别是 Alpine)运行 Java jar,遇到文件路径中包含中文

参数作用范围说明
-Dfile.encoding=UTF-8Java程序内部字符编码(如 I/O 读写、字符串编码等)影响 InputStreamReaderOutputStreamWriter、日志、JSON 等操作
-Dsun.jnu.encoding=UTF-8操作系统交互字符编码(如文件名、路径、系统参数)影响文件名中文乱码、路径处理等系统调用

java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar yourapp.jar

CMD [“java”, “-Dfile.encoding=UTF-8”, “-Dsun.jnu.encoding=UTF-8”, “-jar”, “yourapp.jar”]

⚠️ 注意:这两个参数应 一起设置,否则可能一个编码 UTF-8,另一个仍为系统默认编码,导致混乱。

✅ 适用于哪些情况?

  • Docker 容器(特别是 Alpine)运行 Java jar,遇到文件路径中包含中文
  • Java 程序读取/写入带中文的文件路径、环境变量
  • Windows 上处理中文文件名报错
情况建议设置
Java 程序中处理中文内容-Dfile.encoding=UTF-8
文件名/路径中包含中文-Dsun.jnu.encoding=UTF-8
Docker/Alpine 环境同时加两个参数最稳妥

sgerrand.rsa.pub下载的地址:https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub

glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk下载的地址:Release 2.29-r0 · sgerrand/alpine-pkg-glibc · GitHub

基于alpine:3.10基础镜像构建jdk容器,需要⚠️加上红字的内容,这些变量确保系统使用UTF-8编码处理中文字符

FROM alpine:3.10
MAINTAINER yunhaoz000@gmail.com
WORKDIR /java
ADD jdk-8u411-linux-x64.tar.gz /java
ADD sgerrand.rsa.pub /etc/apk/keys
COPY glibc* /java/
RUN echo "http://mirrors.aliyun.com/alpine/v3.10/main/" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.10/community/" >> /etc/apk/repositories \
&& apk update \
&& apk --no-cache add ca-certificates  \
&& apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
&& rm -rf /var/cache/apk/* glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
&& ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& /usr/glibc-compat/bin/localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
ENV JAVA_HOME /java/jdk1.8.0_411
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
CMD ["java", "-version"]

安装了完整的 glibc 支持并生成了中文 locale。Alpine 默认使用 musl libc,但许多 Java 应用和工具需要 glibc 的支持。

Categories: docker与kubernetes