ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN apk add --no-cache musl-locales
docker exec -it app sh -c 'locale; echo 测试'

应用往 stdout 打中文,docker logs 出来却是成片问号,exec 进去执行 locale 还一直提示 Cannot set LC_ALL to default locale,本机跑不出这个问题,接口返回的 JSON 反而正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:基础镜像里只有 POSIX locale,LANG 没设或者设了却没生成对应语言包,字符按 ASCII 处理,中文就被逐字替换成问号,日志采集端也没法还原,换镜像才能根治。

这次卡住的地方就在「容器 locale 乱码」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:先看镜像里 locale -a 的输出 确认有没有 C.UTF-8 这一项 没有就得补;没有对应语言包就装一个 或者直接改用 C.UTF-8 都能解决;把 LANG 和 LC_ALL 都写进 ENV 别在启动脚本里临时 export 下次重建又忘了。

确认没问题再收工,docker logs 里中文正常显示,exec 进去 echo 中文也不乱码,写到文件的日志同样正常。

作者 9823189