docker - root 没有 crontab

docker - root 没有 crontab

我的 Dockerfile 似乎构建正确(它告诉我如此)。当我运行容器时,我收到以下错误消息。我尝试过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(一些 cron 已被删除):

#!/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 任务

答案1

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

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

答案2

正如其他答案已经解释的那样,CMD每个 Dockerfile 只会运行一个,并且您要运行的命令是错误的。

但在我看来,您的设置有一个更紧迫的问题 - Docker 容器通常不是设计为以这种方式工作的。您应该做的是从主机(或您的编排器)运行 cron 服务作为一次性进程(可能使用类似docker run或 的东西docker-compose run,或者,如果出于某种原因您不想为此启动单独的容器,我想您可以使用docker exec)。

这只是我对如何使用容器的看法,因此显然你应该谨慎对待它。

答案3

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


更多细节:

我的猜测是/pulse/crontab.sh(您没有显示,为什么?)将相关的 crontab 行添加到系统范围的 crontab 文件中/etc/crontab。稍后执行命令crontab -l,但这只会显示错误,因为它列出root个人的crontab 只显示(恰好为空),而不是 中的系统范围的/etc/crontab。这完全正常且符合预期。要显示脚本添加的行,您需要将其替换CMD crontab -lCMD cat /etc/crontab

所有这些都与任何 dockerfile 命令(例如)ADD无关,它们只是基本的 Linux 内容。RUNCMD

相关内容