最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

向木偶操纵者传递内部 docker 网络 URL

网站源码admin38浏览0评论

向木偶操纵者传递内部 docker 网络 URL

向木偶操纵者传递内部 docker 网络 URL

当我的页面托管在远程主机上时,我可以让 puppeteer 正常工作:

const url = '.html';
await page.goto(url);

我在我自己的服务器上运行的 Docker 容器(成群)内的 node.js 应用程序中运行它,并通过 CapRover 部署,它完成了设置 docker 服务等的所有工作

为了消除对

paidhost
的需求,以便从 puppeteer 到“主机”的请求甚至不需要离开我的服务器,我想我应该能够提供相同的内容(html、js、cs、图像等) ) 通过在我现有服务器上运行的第二个节点应用程序使用快速静态文件,在同一个 docker 群中。

第二个节点应用程序(托管我的网页)可通过 URL

http://srv-captain--mynodehost/app/mypage.html
在 swarm 内部访问。所谓内部,我指的是一个 URL,它允许通过 docker 网络在内部发送请求,该网络连接群中的容器,如所提到的 here 和 here.

我已经确认由第二个节点应用程序服务的 html 页面 可以通过内部 URL 通过 docker 网络从第一个节点应用程序访问,因为从第一个节点应用程序获取原始 html 页面本身(不尝试呈现它) 通过 URL 使用我最喜欢的 http 请求库

http://srv-captain--mynodehost/app/mypage.html
工作正常......所以它绝对可以通过这种形式的 URL 在“内部”访问。

我也可以从公共 Web 浏览器访问此页面,该浏览器通过

.html
从外部访问此节点服务器,并且在浏览器中一切正常。

所以下面的“外部”负载起作用:

const url = '.html';
await page.goto(url);

但是当我使用“内部”URL 从第一个节点应用程序加载 puppeteer 页面时,它不起作用(即使页面应该可以访问......见上文):

const url = 'http://srv-captain--mynodehost/app/mypage.html';
await page.goto(url);

它尝试了一会儿,然后就超时了

TimeoutError: Waiting failed: 20000ms exceeded
.

使用“外部”URL(指向我的节点“主机”服务器)有一个好处......我不必为

paidhost
付费。但这仍然意味着流量被发送到集群之外,服务器之外,然后再次返回。我想通过此实现的主要好处是减少延迟,而不是降低成本。

那么,如何将 puppeteer 指向内部 docker 网络 URL,并让它工作?

Dockerfile 包含以下用于 puppeteer 安装的内容:

FROM node:18.15.0
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
     chromium \
     (various other dependencies) \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
ENV CHROME_PATH=/usr/bin/chromium
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
CMD [ "npm", "start" ]

使用 package.json:

"dependencies": {
  "puppeteer": "^19.11.0",
  (various other dependencies)
},

容器内运行的chromium版本为:

# chromium --version
Chromium 112.0.5615.121 built on Debian 11.6, running on Debian 11.6
回答如下:
发布评论

评论列表(0)

  1. 暂无评论