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
相关产品推荐
相关产品推荐

