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

时间:2018-01-10 17:22:20

标签: 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 puppeteer之后添加yarn install,并用yarn install替换Dockerfile中的npm install

需要改变什么,以便我可以按预期使用含铬的木偶操纵者?

Express app的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

搬运工-compose.yml:

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

index.js route:

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

3 个答案:

答案 0 :(得分:2)

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

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

但是,它还会通过yarn install中的Dockerfile覆盖之前安装在泊坞广告容器上的铬版本,并在上安装了Chrome版本机器在命令行中通过yarn install

每台机器都需要自己的,正确的,特定于操作系统的铬版本。 docker容器需要特定于linux的chrome(linux-515411),我的笔记本电脑需要特定于mac的铬(mac-508693)。只需在yarn install中使用木偶操作员npm install(或package.json)运行即可安装正确版本的铬。

以前的项目结构:

.
├── 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目录的所有内容。 包括错误版本的铬。

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 volume将本地./code/src的全部内容映射到docker容器的/usr/src/app。这 NOT 包含node_modules目录:

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

答案 1 :(得分:0)

大家好,请访问此链接。这对于想要在Docker容器中启动无头木偶的人很有帮助

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

这是我的项目代码结构

  • config
  • 移民
  • 模型
  • 实用程序
  • .dockerignorefile
  • app.js
  • docker-compose.yml
  • Dockerfile
  • package.json

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

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

这是我关于docker内部无头Chrome的仓库

https://github.com/frayhan94/mandiri-scrap

答案 2 :(得分:0)

我遇到了这个问题,我想离开简单的解决方案。找不到chrome安装的原因是我已将本地卷安装到容器中进行测试。我使用的是Mac,因此本地npm install给了我Mac版的Chrome。将那个node_modules文件夹装入Linux容器后,它希望找到不存在的Linux版本。

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

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