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

Alpine Docker环境下Playwright无法启动Chrome的问题求助

在Docker的node:lts-alpine镜像中运行Playwright爬虫时Chrome启动失败的问题

错误信息

INFO  PlaywrightCrawler: Starting the crawl
WARN  PlaywrightCrawler: Reclaiming failed request back to the list or queue. browserType.launchPersistentContext: Failed to launch: Error: spawn /root/.cache/ms-playwright/chromium-1060/chrome-linux/chrome ENOENT
=========================== logs ===========================
<launching> /root/.cache/ms-playwright/chromium-1060/chrome-linux/chrome --disable-field-trial-config --disable-background-networking --enable-features=NetworkService,NetworkServiceInProcess --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=ImprovedCookieControls,LazyFrameLoading,GlobalMediaControls,DestroyProfileOnBrowserClose,MediaRouter,DialMediaRouteProvider,AcceptCHFrame,AutoExpandDetailsElement,CertificateTransparencyComponentUpdater,AvoidUnnecessaryBeforeUnloadCheckSync,Translate --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --no-first-run --enable-automation --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --no-sandbox --proxy-server=http://127.0.0.1:43519 --proxy-bypass-list=<-loopback> --disable-blink-features=AutomationControlled --user-data-dir=/tmp/playwright_chromiumdev_profile-oKPLgl --remote-debugging-pipe about:blank
[pid=N/A] starting temporary directories cleanup
[pid=N/A] finished temporary directories cleanup
============================================================
 {"id":"Gl0EwOcnElHCOkr","url":"https://labs.withgoogle.com/","retryCount":1}

爬虫代码

const scrapeWebsiteUsingApify = async (source) => {
  const { Actor } = Apify;
  const { PlaywrightCrawler } = Crawlee;
  try {
    const sourceKey = source.replace(/[^a-zA-Z0-9]/g, '');
    await Actor.init();
    const store = await Actor.openKeyValueStore();

    // 检查存储中是否已有该源的爬取数据
    const record = await store.getValue(sourceKey);
    if (record) {
      // 直接返回已有数据
      return record;
    }

    // 存储中无数据则执行爬取
    let content;
    const crawler = new PlaywrightCrawler({
      async requestHandler({ page }) {
        await page.waitForTimeout(3000);
        content = await page.content();
      },
    });

    const crawledInfo = await crawler.run([source]);
    // 将爬取结果存入存储
    await store.setValue(sourceKey, { ...crawledInfo, content });
    return { ...crawledInfo, content };
  } catch (e) {
    return null;
  }
};

环境与排查情况

  • 本地M1 MacBook Pro运行正常,部署到Docker的node:lts-alpine镜像后报错
  • 确认Chrome文件存在于/root/.cache/ms-playwright/chromium-1060/chrome-linux/chrome,权限为-rwxr-xr-x 1 root root
  • 已尝试将Chrome路径添加到$PATH,问题未解决

原因分析

node:lts-alpine基于Alpine Linux,使用musl libc作为C标准库;而Playwright默认下载的Chromium是针对glibc编译的。两者库不兼容,导致即使Chrome文件存在,系统也无法正确执行,最终抛出ENOENT错误(本质是缺少依赖,并非文件不存在)。

修复方案

方案一:改用基于Debian的Node镜像(推荐)

替换镜像为node:lts或node:lts-slim,这类镜像使用glibc,无需额外处理依赖。示例Dockerfile:

FROM node:lts
WORKDIR /app

# 安装依赖并下载Playwright Chromium
COPY package*.json ./
RUN npm install
RUN npx playwright install chromium

COPY . .
CMD ["node", "your-script.js"]

方案二:在Alpine镜像中安装glibc兼容层

若必须使用Alpine,需安装glibc来兼容Chromium:

FROM node:lts-alpine
WORKDIR /app

# 安装glibc兼容层
RUN apk add --no-cache wget
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
RUN apk add glibc-2.34-r0.apk

# 安装Chromium系统依赖
RUN apk add --no-cache chromium nss freetype freetype-dev harfbuzz ca-certificates ttf-freefont

# 安装项目依赖并重新下载兼容的Chromium
RUN npm install
RUN npx playwright install chromium --force

COPY . .
CMD ["node", "your-script.js"]

注意:glibc版本需与Playwright下载的Chromium兼容,后续版本更新可能需要调整。

方案三:使用系统安装的Chromium

修改代码,指定Playwright使用Alpine系统安装的Chromium:

const crawler = new PlaywrightCrawler({
  launchContext: {
    launchOptions: {
      executablePath: '/usr/bin/chromium-browser', // Alpine中系统Chromium路径
      args: ['--no-sandbox', '--disable-dev-shm-usage']
    }
  },
  async requestHandler({ page }) {
    await page.waitForTimeout(3000);
    content = await page.content();
  },
});

需确保Dockerfile中已通过apk add chromium安装系统Chromium。

内容的提问来源于stack exchange,提问作者Raj Chandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:32:34