如何使用Docker将带有cron作业的NodeJS应用容器化?

时间:2019-04-14 13:38:58

标签: node.js linux docker cron

我有一个NodeJS应用程序,由REST API和通宵维护(cron)作业组成。当前正在Debian Linux上运行。

Dockerize的最佳实践是什么?

  • 我可以使用官方的“节点” Docker映像,但是其中不包含crontab。
  • 我可以使用官方的“ alpine” Docker映像(并在其中安装NodeJS),但是我无法通过轻松地拉取新版本的官方映像来升级NodeJS。

实现此目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

使用官方nodejs码头工人镜像并使用您的代码构建码头工人镜像。

您需要运行两个容器,一个用于Rest API,另一个用于cron作业。

对于cron作业,您不需要conrtab在docker映像内,而是计划在主机上运行的映像,如下所示:

这将确保按要求的时间间隔运行docker映像。

crontab -e
* */2 * * * docker run -it app/cron-image:v1

答案 1 :(得分:0)

解决方案#1

使用节点 cron 包。我添加了一些来自真实项目的代码示例。每小时我都会抓取一个网站。您可以设置时间并将重复任务放置在 cron.schedule 中。您可以将其用作单独的项目或与您的 api 代码结合使用。

import { Scraper } from './controller/scraper.js';
import cron from 'node-cron'

cron.schedule('0 0 */1 * * *', () => {
  console.log('running a task every hour');
  const scraper = new Scraper()
  const data = scraper.getData()
});

解决方案#2

Docker 官网不建议使用容器运行进程管理器。但是如果你需要,你可以使用。我使用 pm2 作为流程管理器。它可用于在某些时间间隔内运行应用程序,如果应用程序崩溃,它可以重新启动您的应用程序。

可以帮助您的链接:

我的用例:

  • 如果应用崩溃,请重新启动。
  • 每小时运行 app.js 文件。