我的 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 -l
为CMD cat /etc/crontab
。
所有这些都与任何 dockerfile 命令(例如)ADD
无关,它们只是基本的 Linux 内容。RUN
CMD