Node.js Canvas在Mac本地Docker正常,AWS EC2 Ubuntu Docker渲染异常
Node.js Canvas在Ubuntu Docker环境渲染异常的排查与解决
核心问题分析
本地Mac Docker环境渲染正常,但AWS EC2 Ubuntu Docker中出现异常,大概率是系统依赖缺失、字体加载异常或路径/权限问题导致,以下是针对性的排查和解决步骤:
1. 补充Ubuntu Docker环境的Canvas依赖库
Node.js Canvas在Linux环境下依赖多个系统图形库,Ubuntu官方镜像默认未预装这些组件,需在Dockerfile中添加安装步骤:
FROM node:18-bullseye # 安装Canvas必需的系统依赖 RUN apt-get update && apt-get install -y \ libcairo2-dev \ libpango1.0-dev \ libjpeg-dev \ libgif-dev \ libfontconfig1-dev \ libfreetype6-dev \ && rm -rf /var/lib/apt/lists/* # 后续镜像构建步骤... WORKDIR /app COPY package*.json ./ RUN npm install COPY . .
2. 修复字体加载问题
(1)使用绝对路径注册字体
容器内相对路径可能因工作目录差异失效,改用绝对路径确保字体文件可被找到:
import path from 'path'; // 替换原registerFont代码 registerFont(path.resolve(__dirname, './src/common/open-sans-condensed/OpenSans-Light.ttf'), { family: 'Open Sans Condensed', weight: 300 // 用数值权重替代字符串,避免匹配异常 }); registerFont(path.resolve(__dirname, './src/common/open-sans-condensed/OpenSans-Bold.ttf'), { family: 'Open Sans Condensed', weight: 700 });
(2)统一字体权重的使用方式
代码中字体样式需和注册时的数值权重对应:
// 原"bold"改为700 ctx.font = '700 26pt "Open Sans Condensed"'; // 原"Light"改为300 ctx.font = '300 12pt "Open Sans Condensed"';
3. 检查资源路径与权限
- 确保logo、QR图片在Docker镜像构建时已被正确复制到容器内,使用绝对路径加载:
const logo = await loadImage(path.resolve(__dirname, logoImagePath)); - 确认生成图片时的目标目录有权限写入,可在Dockerfile中添加目录权限设置:
RUN mkdir -p /app/assets/emailBanner && chmod 755 /app/assets/emailBanner
4. 验证DPI缩放逻辑
代码中针对Mac设置2倍DPI,Ubuntu下用1倍,若渲染异常可尝试暂时统一DPI值测试,排除缩放导致的坐标计算问题:
// 临时注释平台判断,统一用1倍DPI测试 // const dpi = process.platform === 'darwin' ? 2 : 1; const dpi = 1;
内容的提问来源于stack exchange,提问作者Kokulan
相关产品推荐
相关产品推荐

