【发布时间】:2019-10-27 08:27:32
【问题描述】:
我正在尝试运行每 15 分钟运行一次脚本的 Node 12.13.0 Alpine Docker 容器。根据Alpine's wiki cron section,我应该能够在 Dockerfile 中添加一个 RUN 任务,通过以下方式将 crond 作为服务运行:
rc-service crond start && rc-update add crond
然而这会返回一个错误:
rc-service: service `crond' does not exist
运行一个单独的 Docker 容器只是为了针对这个 Docker 容器运行 cron 任务是不一个选项。这个容器已经非常轻量级了,并没有做太多的事情。
这是我的 Dockerfile:
FROM node:12.13.0-alpine
RUN apk add --no-cache tini openrc
WORKDIR /opt/app
COPY script.sh /etc/periodic/15min/
RUN chmod a+x /etc/periodic/15min/script.sh
RUN rc-service crond start && rc-update add crond
COPY . .
RUN chmod a+x startup.sh
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["./startup.sh"]
如有任何帮助,我们将不胜感激。
【问题讨论】:
-
作为一般规则,init 脚本在 Docker 中不起作用:实际上没有任何东西运行它们,而且通常没有合适的 init 系统。 (在您的示例中,
tini是一个轻量级 init,它处理信号并收获僵尸,但除此之外只运行一个子进程。)“一个单独的容器”或“主机 cron”是这里的标准答案。 -
@DavidMaze 我不确定您具体指的是问题的哪一部分。您似乎正在解决两个不同的问题:我对 tini 的使用,以及我试图设置一个 cron 任务。在我的“启动”脚本中,crond 是我使用 tini 来控制 sigterms 的。我直接在我的节点应用程序代码中处理 sigterms。