DomPDF本地可用自定义字体,Docker生产环境无法加载求助
DomPDF 3.1.0 在Docker容器中无法加载自定义字体的解决方法
1. 确认字体文件已正确同步到容器
- 检查项目根目录的
.dockerignore文件,确保没有排除public/templates/reports/fonts目录,否则COPY . .指令不会把字体文件复制进容器。 - 进入容器执行命令验证文件存在:
确保输出中能看到docker exec -it [你的容器名] ls /var/www/html/public/templates/reports/fonts/Ubuntu-Regular.ttf。
2. 修复字体文件及目录权限
Alpine环境下www-data用户需要读取字体文件的权限,在Dockerfile中添加更精细的权限设置:
RUN chown -R www-data:www-data . \ && chmod -R 755 public/templates/reports/fonts \ && chmod -R 644 public/templates/reports/fonts/*.ttf
或者进入容器手动调整:
docker exec -it [你的容器名] chmod -R 644 /var/www/html/public/templates/reports/fonts/*.ttf
3. 补充Alpine系统的字体渲染依赖
php:8.3-fpm-alpine基础镜像缺少DomPDF渲染字体所需的底层库,在Dockerfile中添加:
RUN apk add --no-cache fontconfig freetype libpng libjpeg-turbo
这些库是字体渲染的必要依赖,缺失会导致DomPDF无法正确解析自定义字体。
4. 修正DomPDF路径配置
- 验证路径正确性:在代码中临时输出
APPPATH . '../public/templates/reports/fonts'的实际值,确认在容器中对应/var/www/html/public/templates/reports/fonts(因为WORKDIR是/var/www/html,APPPATH通常指向application/,拼接后路径应正确)。 - 调整CSS字体路径:将CSS中的相对路径改为基于chroot的绝对路径:
@font-face { font-family: "Ubuntu"; src: url("/fonts/Ubuntu-Regular.ttf"); } - 直接使用绝对路径配置DomPDF:避免APPPATH拼接可能的问题,直接指定绝对路径,同时单独设置缓存目录避免和字体目录混用:
记得创建缓存目录并赋予写权限:$options = new Options(); $options->setIsRemoteEnabled(true); $options->setFontDir('/var/www/html/public/templates/reports/fonts'); $options->setFontCache('/var/www/html/storage/dompdf-cache'); $options->setChroot('/var/www/html/public/templates/reports/'); $this->dompdf = new Dompdf($options);RUN mkdir -p storage/dompdf-cache && chown -R www-data:www-data storage/dompdf-cache
5. 排查默认字体无效问题
如果设置$options->setDefaultFont('Courier')也无效,说明DomPDF配置可能未正确生效:
- 确认代码中没有重复初始化DomPDF覆盖配置。
- 检查模板CSS是否强制指定了
serif等默认字体,尝试暂时注释body的font-family配置,测试默认字体是否生效。
内容的提问来源于stack exchange,提问作者Sabeex
相关产品推荐
相关产品推荐

