我正在尝试使用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
。
需要改变什么,以便我可以按预期使用含铬的木偶操纵者?
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
app:
restart: always
build: ${REPO}
volumes:
- ${REPO}/code:/usr/src/app:ro
working_dir: /usr/src/app
ports:
- "8087:5000"
app.post('/img', function (req, res) {
const puppeteer = require('puppeteer');
(async() => {
const browser = await puppeteer.launch({args: ['--no-sandbox']});
})();
});
答案 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
这是容器获得自己的.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
这是我的项目代码结构
确保已安装docker。安装完成后,您可以按照以下步骤操作
在docker目录中运行 docker-compose up --build
这是我关于docker内部无头Chrome的仓库
答案 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