Es gibt einige Beispiele, die [Puppeteer-Heroku-Buildpack] verwenden (https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack), aber es gibt nicht viele Beispiele, die Docker verwenden. Machen Sie sich also eine Notiz.
Fast alles funktioniert mit einem HTTP-Server, auf dem nur ein Container ausgeführt wird. Sie müssen lediglich den HTTP-Server mit der durch "$ PORT" angegebenen Portnummer starten.
Die Details sind herumgeschrieben.
Versuchen Sie zunächst, etwas bereitzustellen, das nur den http.server von Python verwendet.
Dockerfile
FROM python:3.8-alpine
heroku.yml
build:
docker:
web: Dockerfile
run:
web: python -m http.server $PORT
$ heroku create
$ heroku stack:set container
Einfach git push. Es ist wirklich einfach.
$ git push heroku master
Puppenspieler haben die Möglichkeit, Chromium herunterzuladen, aber es ist trotzdem am besten, Google Chrome (Stable) zu verwenden. (Vorurteil)
Versuchen Sie also, Puppeteer-Core ohne Chromium-Download-Funktion und Google Chrome in einem Docker-Image bereitzustellen.
Dockerfile
# ref: https://github.com/puppeteer/puppeteer/blob/main/.ci/node12/Dockerfile.linux
FROM node:12-slim
# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update \
&& apt-get install -y wget gnupg \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/google-chrome-stable
ENV PUPPETEER_PRODUCT chrome
RUN mkdir /app
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY index.js /app/index.js
CMD npm start
Erstellen Sie für index.js einfach einen geeigneten HTTP-Server, suchen Sie bei Google nach hogehoge, wenn Parameter wie "Q = hogehoge" angegeben sind, und zeigen Sie den Text des Suchergebnisbildschirms an. Mit Dingen.
index.js
const http = require("http");
const url = require("url");
const puppeteer = require("puppeteer-core");
//create a server object:
http
.createServer((req, res) => {
const requestUrl = url.parse(req.url, true);
let keyword = requestUrl.query["q"];
if (!keyword) {
res.write("request with ?q=xxxx");
res.end();
} else {
puppeteer
.launch({
args: ["--no-sandbox", "--disable-setuid-sandbox"],
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
})
.then(async (browser) => {
const page = (await browser.pages())[0] || (await browser.newPage());
//Automatikbetrieb von hier
await page.goto("https://google.com/");
await page.type("input[name='q']", requestUrl.query["q"]);
await Promise.all([
page.waitForNavigation(),
page.keyboard.press("Enter"),
]);
let text = await page.evaluate(() => document.body.textContent);
await page.close();
res.write(text);
res.end();
});
}
})
.listen(process.env.PORT);
package.json ist genau wie npm init --yes`` npm install Puppeteer-Core
ohne besondere Wendung.
package.json
{
"name": "heroku-docker-playground",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/YusukeIwaki/heroku-docker-playground.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/YusukeIwaki/heroku-docker-playground/issues"
},
"homepage": "https://github.com/YusukeIwaki/heroku-docker-playground#readme",
"dependencies": {
"puppeteer-core": "^5.2.1"
}
}
heroku.yml
build:
docker:
web: Dockerfile
run:
web: npm start
Es dauert lange, da der Docker-Build zum Zeitpunkt der Bereitstellung abgeschlossen ist. Wenn Sie jedoch warten, wird der HTTP-Server auf natürliche Weise gestartet.
Mit dieser Art von Gefühl ist es in Ordnung zu kommunizieren, wenn der Google-Fallergebnistext in einer Reihe angezeigt wird.
Wenn Puppenspieler-Core funktioniert, funktioniert auch Dramatiker-Core.
Für Dramatiker wird die Docker-Datei von Microsoft veröffentlicht, sodass Sie darauf verweisen können. https://github.com/microsoft/playwright/blob/master/docs/docker/Dockerfile.bionic
Abgesehen davon ist die Verwendung von Dramatikern mit Azure-Funktionen derzeit nicht intuitiv. Daher kann ich Heroku jedem empfehlen, der Dramatiker nur als Antwort auf eine HTTP-Anfrage ausführen möchte!
Recommended Posts