docker 容器中的 Puppeteer:未下载 Chromium 修订版

Puppeteer in docker container: Chromium revision is not downloaded

我正在尝试使用 docker-compose 在 运行 容器中的 express 应用程序中启动 puppeteer。

应该启动 puppeteer 的行 const browser = await puppeteer.launch({args: ['--no-sandbox']}); 抛出以下错误:

(node:28) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): AssertionError [ERR_ASSERTION]: Chromium revision is not downloaded. Run "npm install"

我试过在 yarn install 之后添加一个 yarn add puppeteer 并用 npm install 替换 Dockerfile 中的 yarn install

需要更改什么,以便我可以按预期使用带有 chromium 的 puppeteer?

Express 应用的 Dockerfile:

FROM node:8

RUN apt-get update

# for https
RUN apt-get install -yyq ca-certificates
# install libraries
RUN apt-get install -yyq libappindicator1 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 libnss3 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
# tools
RUN apt-get install -yyq gconf-service lsb-release wget xdg-utils
# and fonts
RUN apt-get install -yyq fonts-liberation

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY code/package.json /usr/src/app
COPY code/index.js /usr/src/app
RUN mkdir -p /usr/src/app/views
COPY code/views/ /usr/src/app

# install the necessary packages
RUN yarn install

CMD npm run start:dev

docker-compose.yml:

app:
    restart: always
    build: ${REPO}
    volumes:
        - ${REPO}/code:/usr/src/app:ro
    working_dir: /usr/src/app
    ports:
        - "8087:5000"

index.js 路线:

app.post('/img', function (req, res) {
  const puppeteer = require('puppeteer');
  (async() => {
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
  })();
});

我使用的 docker 卷将整个本地 code 目录映射到 docker 容器的 /usr/src/app 目录。

这非常适合在开发过程中快速更新代码。

但是,它还会通过 Dockerfile 中的 yarn install 覆盖先前安装在 docker 容器 上的铬版本在命令行中通过 yarn install 安装在 my machine 上的 chromium 版本。

每个 machine 都需要自己的、正确的、os特定版本的铬。 docker 容器需要 linux 特定的铬(linux-515411),我的笔记本电脑需要 mac 特定的铬(mac-508693)。只需 运行 yarn install(或 npm install)在您的 package.json 中使用 puppeteer 即可安装正确版本的 chromium。

之前的项目结构:

.
├── Dockerfile
├── README.md
└── code
    ├── index.js
    ├── package.json
    └── node_modules
        ├── lots of other node packages
        └── puppeteer
            ├── .local-chromium
            │     └── mac-508693 <--------good for macs, bad for linux!
            ├── package.json
            └── all the other puppeteer files

部分 Dockerfile

这是容器获得自己版本的地方 .local-chromium:

FROM node:8

RUN apt-get update

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY code/package.json /usr/src/app
COPY code/index.js /usr/src/app

# install the necessary packages <------ including puppeteer, with the correct chromium
RUN yarn install

CMD npm run start:dev

前几卷来自docker-compose.yml

这会将所有内容从本地 ${REPO}/code 复制到 docker 容器的 /usr/src/app 目录。 包括错误的 chromium 版本。

volumes:
    - ${REPO}/code:/usr/src/app:ro

更新的项目结构:

.
├── Dockerfile
├── README.md
└── code
    ├── src
    │   ├── index.js
    │   └── package.json
    └── node_modules
        ├── lots of other node packages
        └── puppeteer
            ├── .local-chromium
            ├── package.json
            └── all the other puppeteer files

更新的 docker 卷将本地 ./code/src 的全部内容映射到 docker 容器的 /usr/src/app。这 包括 node_modules 目录:

volumes:
    - ${REPO}/code/src:/usr/src/app:ro

大家好,请访问此 link。这对于想要在 docker 容器

中启动 headless puppeter 的你很有帮助

https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

这是我的项目代码结构

  • 配置
  • 迁移
  • 型号
  • 工具
  • .docker忽略文件
  • app.js
  • docker-compose.yml
  • Dockerfile
  • package.json

确保您已安装 docker。安装后,您可以按照这些步骤

运行 docker-在您的 docker 目录[中编写 --build =12=]

this 是我在 docker

中关于无头 chrome 的回购协议

我 运行 陷入这个问题,我想留下简单的解决方案。它找不到我的 chrome 安装的原因是我已将本地卷安装到容器中进行测试。我用的是mac,所以本地npm install给了我mac版的chromium。当 node_modules 文件夹被装载到 linux 容器中时,它期望找到不存在的 linux 版本。

要解决此问题,您需要在将卷装载到容器中时排除 node_modules 文件夹。我能够通过传递另一个 volume 参数来做到这一点。

docker run -rm \
  --volume ~/$project:/dist/$project \
  --volume /dist/$project/node_modules