本来正在优化一个 url 转 pdf 的 node 服务,项目是使用 puppeteer 进行转换。功能优化提测后,发现转换后的 pdf 中文都不显示了。而本身这次优化没有涉及到转换本身相关的内容,这就很奇怪,而且本地转换都很正常。
一般中文不显示,很可能是缺少中文字体导致的,于是看了项目中的 Dockerfile 确实安装了字体,还特别进行了注释,说明这个问题之前应该考虑过。
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.12/main/" >> /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.12/community/" >> /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/edge/testing/" >> /etc/apk/repositories \
&& apk update && apk upgrade && apk add --no-cache \
chromium \
nss \
freetype \
freetype-dev \
harfbuzz \
ca-certificates \
ttf-freefont \
wqy-zenhei@edge -f
看来大概率是本次代码修改导致的,于是将代码回滚到上一个版本,结果是中文仍然不显示。代码回滚也没能修复,从这看起来好像问题又不在代码层。
接下来,只能对比下线上镜像和测试环境镜像有什么区别了,于是用生产镜像替换测试环境的镜像,结果转换后的 pdf 中文都恢复显示了。在 pod 内执行 fc-list :lang=zh
命令发现,果然生产环境的镜像中包含中文字体,而现在打的镜像中没有该字体。
# fc-list :lang=zh
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Sharp,文泉驛點陣正黑,文泉驿点阵正黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei,文泉驛正黑,文泉驿正黑:style=Regular
到这里,问题就比较清晰了,肯定时构建镜像时安装wqy-zenhei
字体失败了,但是为什么会失败呢。经过一番搜索,终于在 https://gitlab.alpinelinux.org/alpine/aports/-/issues/15509 中找到了答案。
原因是构建镜像 Dockerfile 中指定了第三方依赖镜像仓库,而字体 wqy-zenhei 从 v3.19 从 edge/testing 移到了 community(时间在 2023 年 11 月),原先的仓库该字体已无法下载。见: https://mirrors.aliyun.com/alpine/v3.19/
于是在安装字体时重新指定第三方依赖仓库就可以了。不过这个留的坑挺危险的,依赖的第三方依赖还是尽量用稳定的版本。
RUN echo "https://mirrors.aliyun.com/alpine/v3.19/community/" > /etc/apk/repositories \
&& apk add --no-cache wqy-zenhei
标签:wqy,zenhei,url,puppeteer,apk,&&,镜像,pdf,文泉
From: https://www.cnblogs.com/hans-hu/p/18198845