docker工人 – 根没有crontab

我的Dockerfile似乎正确地build立(这告诉我)。 当我运行容器时,我得到下面的错误信息。 我曾尝试运行带有和没有服务目录的命令( CMD )。

crontab.sh基本上写一个cron调度到一个文本文件( cron.jobs ),然后将文本文件导入到crontab。

Dockerfile:

 FROM node:0.10 MAINTAINER Tom VOLUME /var/log/ RUN mkdir /pulse ADD . /pulse WORKDIR /pulse RUN apt-get update && apt-get install -y cron ADD *.sh /pulse/ RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/ RUN chmod 644 /etc/crontab CMD cron -f CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log CMD cron /pulse/cron.jobs CMD crontab -l 

edited to add crontab.sh

crontab.sh(一些crons已被删除):

 #!/bin/bash cat <<- 'EOF' > cron.jobs 0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1 EOF crontab cron.jobs 

错误:

 no crontab for root 

边注:

  • Pulse是服务的名称。
  • 由于服务节点的版本是旧的,这将被升级。
  • 该服务主要用于节点中的cron作业

这是dockerfile(而不是文件中的命令)的问题。 只有一个CMD运行(最后一个) – 请参阅https://docs.docker.com/engine/reference/builder/#cmd

Dockerfile中只能有一个CMD指令。 如果列出多个CMD,则只有最后一个CMD才会生效。

正如其他答案已经解释过的,每个Dockerfile只能运行一个CMD并且你想运行的命令是错误的。

但是,您的设置IMO存在一个更紧迫的问题 – Docker容器通常不是以这种方式工作的。 你应该做的是从主机(或你的orchestrator)运行cron服务作为一次性进程(可能使用诸如docker rundocker-compose run ,或者如果由于某种原因你不想启动单独的容器为此,我想你可以使用docker exec )。

这只是我对容器应该如何使用的看法,显然你应该用一粒盐。

如果将其添加到/etc/crontab ,则不会显示在root的个人crontab中,因为这只包含用crontab -e编辑的用户特定的crontab,而不是/etc的系统范围的crontab -e


更多细节:

我的猜测是/pulse/crontab.sh (你不显示,为什么?)将相关的crontab行添加到系统范围的crontab文件/etc/crontab 。 稍后执行命令crontab -l ,但这仅显示一个错误,因为它仅列出root 个人 crontab(恰好为空),而不是/etc/crontab系统范围的/etc/crontab 。 这完全正常和预期。 要显示脚本添加的行,可以用CMD cat /etc/crontabreplaceCMD crontab -l

所有这些对于像ADDRUN或者CMD这样的dockerfile命令都没有什么关系,它只是Linux的基本function。