docker - 没有 root 的 crontab

Tom*_*rth 10 cron docker

我的 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

错误:

no crontab for root
Run Code Online (Sandbox Code Playgroud)

旁注:

  • Pulse 是服务的名称。
  • 由于服务原因,node 版本较旧,将进行升级。
  • 该服务本质上是针对 node 中的 cron 作业

Pau*_*ane 11

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

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

  • 我认为将其称为问题有点过分。此行为是设计使然。容器不是迷你操作系统。它们以应用程序为中心。 (2认同)

小智 5

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

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

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

  • 我对 cron 只是暂时熟悉,但我认为为了使这一点变得合理,CMD 需要运行 crond。否则,容器将在 crontab 命令完成后退出。 (2认同)