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
我正在尝试使用 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