docker-没有用于根的crontab


10

我的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(一些克朗已经被删除):

#!/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作业

Answers:


11

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

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


嗯,还有其他的要点:)致OP:这不会使我的解释无效,因此您基本上必须将替换CMDRUN
斯文

2
我认为将此问题称为“小问题”。此行为是设计使然。容器不是小型OS。它们以应用程序为中心。
JimmyJames

同意 我的意图是澄清OP的问题在于其docker配置中,而不是cron的任何详细信息。
保罗·霍尔丹

这不是docker 问题。这是设计使然。
Andrew Savinykh

5

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

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

这只是我对如何使用容器的看法,因此显然您应该带着一粒盐。


2
我对cron仅有一点点的熟悉,但是我认为为了使之明智,CMD必须运行crond。否则,容器将在crontab命令完成后退出。
JimmyJames

@JimmyJames你的意思是对的,但是就像我在上面解释的那样,更好的解决方案是从外部cron一次性运行这些命令docker run。更多的容器。:)
Artur Ciesielski's

你可能是对的。这个问题很有趣,因为不清楚将crond作为容器的命令是否有意义。它可能是可行的,但在容器中看起来确实很尴尬。
JimmyJames

3

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


更多细节:

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

所有这一切都无关,与任何dockerfile命令一样ADDRUN或者CMD,这只是基本的Linux的东西。


我想我明白这一点。我的构建设置在用户身上,但我的运行设置正在尝试从根目录的crontab运行吗?这是有道理的,我将尝试解决该问题。我猜你不是这个意思:ADD . /etc/crontab因为那不起作用。
TomFirth '17

@TomFirth:这没有多大意义。请阅读我的编辑以获取更多详细信息。
斯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.