You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:56:11