Docker 不执行等待函数

Posted

技术标签:

【中文标题】Docker 不执行等待函数【英文标题】:Await function is not executed by Docker 【发布时间】:2022-01-23 01:06:07 【问题描述】:

我正在使用 Docker 和 docker-compose 运行一个带有 puppeteer 的 NodeJS 抓取工具。我的故障排除如下:

预期输出: 我从***获取标题页

案例 1: 使用 await 运行 function1() 时,进程停止

OUTPUT: 
Browser is running
//console.log("function1() end" ) does not execute

案例2: 如果 function1() 没有 await 则该函数不会执行,但 console.log after 会被执行

OUTPUT:
Browser is running
function1() end

如何使用 await 运行 function1 并获取页面输出的标题。


async function function1() 
  let page = await browser.newPage()
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
  )
  await page.goto(
    'https://en.wikipedia.org/wiki/Main_Page',
    
      waitUntil: 'networkidle2',
    ,
  )
  console.log(await page.title())



async function looper() 
  await function1()
  await console.log('function1 end')


async function startPuppeteer() 
  browser = await puppeteer.launch(
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
  )

  console.log('Browser is running')
  setInterval(looper, 30000)


Dockerfile


FROM buildkite/puppeteer:latest

USER root

COPY . /app

RUN cd /app && npm install 

EXPOSE 8000

WORKDIR /app

CMD npm run start

Docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"

【问题讨论】:

你能显示function1和function2的代码吗?你怎么知道他们没有被处决?你有console.log这些功能吗? 在启动 headless chrome 后有一个 console.log 始终运行。刮板功能在没有 docker 的情况下执行,当使用 docker 时,await function1 和 await function2 不执行。此外,我编辑了帖子以显示 console.logs 那么 function1 和/或 function2 中一定有一些东西阻止它运行。没有看到代码是不可能提供帮助的。 我添加了main函数,谢谢大家的帮助 【参考方案1】:

在 headless 中使用 chrome 部署刮板时,使用 puppeteer 不起作用。我不得不切换到 heroku 并实现 webpacks。使用此答案的帮助:https://***.com/a/55090914/7696261 我能够部署该服务。

【讨论】:

以上是关于Docker 不执行等待函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥Node Js mongoose文档删除不等待不执行?

等待异步函数在 dart 中无法正确执行

如何等待递归直到函数完成执行

如何等待异步函数执行?

在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成

在执行下一行之前等待 5 秒