构建Docker镜像运行时puppeteer抛出SyntaxError正则表达式错误如何解决
问题根源
- 报错
SyntaxError: Invalid regular expression: ... Invalid group是因为代码中用到了正则命名捕获组((?<attribute>这类语法),该特性是Node.js 10.0+版本才支持的ES2018特性。 - 你的Dockerfile存在明显的版本不一致问题:构建依赖阶段用了
node:12-alpine镜像,但是运行阶段使用ubuntu:18.04默认软件源安装的nodejs版本为8.x,远低于你本地的Node 12版本,完全不支持正则命名捕获组语法,因此启动直接报错。 - 你安装的puppeteer版本适配的Node版本高于8.x,在Node 8环境下本身就无法正常运行。
解决方案
方案1:直接使用官方Node 12镜像作为运行环境(最简便,推荐)
直接修改Dockerfile为如下内容,避免多阶段镜像系统库、Node版本不一致的问题:
FROM node:12-alpine # 安装运行所需依赖 RUN apk update && apk add python3 py3-pip make g++ ffmpeg && rm -rf /var/cache/apk/* WORKDIR /usr/src/app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 8082 CMD [ "node", "server.js" ]
方案2:如果必须使用ubuntu 18.04作为基础镜像,手动安装对应Node 12版本
修改运行阶段的Node安装逻辑,不要使用默认源的旧版本Node:
FROM node:12-alpine AS BUILD_IMAGE RUN apk update && apk add python3 py3-pip make g++ && rm -rf /var/cache/apk/* WORKDIR /usr/src/app COPY package*.json ./ RUN npm ci --only=production COPY . . FROM ubuntu:18.04 WORKDIR /usr/src/app # 先安装Node.js 12版本 RUN apt-get update && yes | apt-get install apt-utils curl gnupg2 RUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash - RUN yes | apt-get install nodejs ffmpeg # 拷贝构建产物和依赖 COPY . . COPY --from=BUILD_IMAGE /usr/src/app/node_modules ./node_modules EXPOSE 8082 CMD [ "node", "server.js" ]
额外注意事项
- Puppeteer v19.0+开始要求Node 14+版本,如果修改完Node版本后仍然报错,可以在package.json中将puppeteer版本锁定为
"puppeteer": "^18.2.1",重新安装依赖即可。 - 如果启动后出现缺少动态链接库的报错,alpine环境可以额外安装
chromium包,ubuntu环境可以额外安装gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget即可解决。
内容的提问来源于stack exchange,提问作者Ninh quang Nguyen
相关产品推荐
相关产品推荐

