【问题标题】:Alpine: "service `crond' does not exist"阿尔卑斯山:“服务‘crond’不存在”
【发布时间】: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。

标签: docker cron alpine


【解决方案1】:

问题是一些 Alpine Docker 容器没有安装 busybox-initscripts package。安装后,crond 作为服务运行。我遇到的另一个问题是run-parts,执行/etc/periodic 文件夹中文件的命令预计没有扩展名,所以我去掉了它,现在一切正常。

工作的 Dockerfile 如下所示:

FROM node:12.13.0-alpine

RUN apk upgrade --available

RUN apk add --no-cache tini openrc busybox-initscripts

WORKDIR /opt/app

COPY runScraper /etc/periodic/15min/

RUN chmod a+x /etc/periodic/15min/runScraper

COPY . .

RUN chmod a+x startup

ENTRYPOINT ["/sbin/tini", "--"]

CMD ["./startup"]

【讨论】:

  • 我想你忘了在这个 Dockerfile 版本中添加RUN rc-service crond start && rc-update add crond。不是吗?
  • busybox-initscripts 负责加载它,并且应该在安装包后运行。我认为crond 和许多其他支持库都从这个特定的图像中被剥离了。如果内存正常,busybox-initscripts 是当时将crond 安装/加载到裸 Alpine 映像的推荐方法。
  • @ClarkBrent 我已经为此苦苦思索了两天。我已经尝试了很多事情,只是在这里找到了你的答案。我试过这个,但这似乎仍然不起作用。我看到你安装了'busybox-initscripts',但是这些initscripts在哪一行被执行?它在你的启动脚本中吗?
  • @vrijdenker busybox-initscripts 包中的所有脚本(包括crond)应在apk 安装后立即启动。启动 shell 脚本只是运行了一个小型节点应用程序。至于实际创建一个 cronjob,我只是用我需要的命令制作了另一个 shell 脚本,并将其放入 /etc/periodic 文件夹之一,并使其可执行。
  • @vrijdenker 查看我发布的答案,我遇到了与您刚才完全相同的问题,现在看来您需要明确创建一个文件才能使其仍然启动,即使已安装并激活了 openrc " crond”通过busybox-initscripts。
【解决方案2】:

自从上一个解决方案发布以来,Alpine 可能已经改变了工作方式,现在它只是报告回来:

 # rc-service crond start
 * You are attempting to run an openrc service on a
 * system which openrc did not boot.
 * You may be inside a chroot or you may have used
 * another initialization system to boot this system.
 * In this situation, you will get unpredictable results!
 * If you really want to do this, issue the following command:
 * touch /run/openrc/softlevel
 * ERROR: syslog failed to start
 * ERROR: cannot start crond as syslog would not start

在安装“busybox-initscripts”时静默失败,它会自动激活它。

重要的是:

touch /run/openrc/softlevel

这使它工作,请注意您仍然需要安装之前解决方案的其余部分,即“openrc”和“busybox-initscripts”。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2013-04-02
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2014-04-20
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多