如何在 MacOS Apple Silicon M1 arm64 主机上的 Docker 容器上 运行 Puppeteer
How to run Puppeteer on a Docker container on a MacOS Apple Silicon M1 arm64 host
我无法 运行 我在 Docker 容器内的 Puppeteer 上进行单元测试。我的主机是带有 Apple Silicon M1 (arm64) 芯片的 MacOS。我也尝试按照 the Puppeteer Github documentation 的说明进行操作,但它们适用于 amd64。有什么建议吗?
由于某些原因,直接安装 puppeteer NPM 包无法正常工作,遗憾的是 GitHub 中的官方 Puppeteer 文档与 arm64 架构不兼容。
这是我准备 Dockerfile 的方式:
FROM node:16
RUN apt-get update \
&& apt-get install -y chromium \
fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends
USER node # non-root user that comes with `node` images.
WORKDIR /app
COPY --chown=node package.json .
COPY --chown=node package-lock.json .
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium
RUN npm install
COPY --chown=node . /app
配置的 Dockerfile 是 Apple Silicon (linux/arm64) 原生的,也是 amd64 (linux/amd64) 架构原生的。
您还必须在代码中将 --no-sandbox
参数传递给浏览器:
export async function createBrowserInstance(): Promise<puppeteer.Browser> {
return await puppeteer.launch({
args: ['--no-sandbox'], // Required.
headless: true,
});
}
额外的标志会禁用浏览器的开发沙箱,因此请确保只访问受信任的页面。否则没关系。未来的某个人,请随时编辑此答案或评论如何摆脱 --no-sandbox
论点。
我无法 运行 我在 Docker 容器内的 Puppeteer 上进行单元测试。我的主机是带有 Apple Silicon M1 (arm64) 芯片的 MacOS。我也尝试按照 the Puppeteer Github documentation 的说明进行操作,但它们适用于 amd64。有什么建议吗?
由于某些原因,直接安装 puppeteer NPM 包无法正常工作,遗憾的是 GitHub 中的官方 Puppeteer 文档与 arm64 架构不兼容。
这是我准备 Dockerfile 的方式:
FROM node:16
RUN apt-get update \
&& apt-get install -y chromium \
fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends
USER node # non-root user that comes with `node` images.
WORKDIR /app
COPY --chown=node package.json .
COPY --chown=node package-lock.json .
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium
RUN npm install
COPY --chown=node . /app
配置的 Dockerfile 是 Apple Silicon (linux/arm64) 原生的,也是 amd64 (linux/amd64) 架构原生的。
您还必须在代码中将 --no-sandbox
参数传递给浏览器:
export async function createBrowserInstance(): Promise<puppeteer.Browser> {
return await puppeteer.launch({
args: ['--no-sandbox'], // Required.
headless: true,
});
}
额外的标志会禁用浏览器的开发沙箱,因此请确保只访问受信任的页面。否则没关系。未来的某个人,请随时编辑此答案或评论如何摆脱 --no-sandbox
论点。