我正在尝试使用 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
.
需要改变什么,以便我可以按预期使用带有 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 install
在 my 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/