node.js - docker 容器中的 puppeteer 操纵者 : Chromium revision is not downloaded

标签 node.js docker docker-compose puppeteer

我正在尝试使用 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 add puppeteeryarn install 之后并替换yarn installDockerfilenpm install .

需要改变什么,以便我可以按预期使用带有 Chrome 的 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 容器 上的 chromium 版本,其版本为通过命令行中的 yarn installmy machine 上安装 chromium。

每台机器都需要自己的、正确的、特定于操作系统的 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。这 NOT 包含 node_modules 目录:

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

关于node.js - docker 容器中的 puppeteer 操纵者 : Chromium revision is not downloaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192863/

相关文章:

node.js - AWS Cognito Lambda触发两次

docker - 我无法使用Nginx作为Nexus的反向代理服务器登录Docker

postgresql - 官方 Postgres 镜像如何使用环境变量创建用户和数据库?

docker - Gitlab 如何在 Docker 容器上注册运行器?

ruby-on-rails - Docker - PG::ConnectionBad

javascript - 如何从nodejs中的守护进程生成gpg子进程?

node.js - 根据操作系统确定路径字符串类型的方法

javascript - 保存已经用 Meteor 文件上传的文件信息

docker - Docker Compose 中外部卷和默认卷之间的区别?

docker - 带有Hyper-V示例的Docker Windows让我感到困惑为什么阿尔卑斯的例子不能像我想的那样起作用?