【问题标题】:Puppeteer in docker container: Chromium revision is not downloadeddocker 容器中的 Puppeteer:未下载 Chromium 修订版
【发布时间】:2021-12-13 19:23:25
【问题描述】:

我正在尝试使用 docker-compose 在 docker 容器中运行的快速应用程序中启动 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 并将 Dockerfile 中的 yarn install 替换为 npm install

需要改变什么,以便我可以按预期使用带有铬的 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']});
  })();
});

【问题讨论】:

    标签: node.js docker docker-compose puppeteer


    【解决方案1】:

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

    这对于在开发过程中允许快速代码更新非常有用。

    但是,它还会用 我的机器上安装的 chromium 版本覆盖 Dockerfile 中的 yarn install 之前安装在 docker 容器 上的 chromium 版本。 > 通过命令行中的yarn install

    每台机器都需要自己的、正确的、特定于操作系统的 Chromium 版本。 docker 容器需要一个 linux 特定的 chromium (linux-515411),我的笔记本电脑需要一个 mac 特定的 chromium (mac-508693)。只需在 package.json 中使用 puppeteer 运行 yarn install(或 npm install)即可安装正确版本的 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
    

    【讨论】:

    • 您能解释一下您的解决方案吗?我有同样的问题,但我不知道该怎么做。我还没有使用 docker compose,但我仍然面临同样的问题。任何帮助,将不胜感激。谢谢
    • @jprivillaso 看看编辑/重写的答案。这有帮助吗?
    【解决方案2】:

    我遇到了这个问题,我想放弃简单的解决方案。它找不到我的 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
    

    【讨论】:

    • 伟大的被忽视的点。使用 .dockerignore -> node_modules 可能是防止本地版本的 chromium 跨入容器的另一种方法吗?
    【解决方案3】:

    大家好,请访问此链接。这对于想要在 docker 容器中启动无头 puppeter 的你非常有帮助

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

    这是我的项目代码结构

    • 配置
    • 迁移
    • 型号
    • 实用工具
    • .dockerignorefile
    • app.js
    • docker-compose.yml
    • Dockerfile
    • package.json

    确保您已安装 docker。安装后,您可以按照以下步骤操作

    在你的 docker 目录中运行 docker-compose up --build

    this 是我关于 docker 内的 headless chrome 的仓库

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2013-10-09
      相关资源
      最近更新 更多