我的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
边注:
这是dockerfile(而不是文件中的命令)的问题。 只有一个CMD
运行(最后一个) – 请参阅https://docs.docker.com/engine/reference/builder/#cmd
Dockerfile中只能有一个CMD指令。 如果列出多个CMD,则只有最后一个CMD才会生效。
正如其他答案已经解释过的,每个Dockerfile只能运行一个CMD
并且你想运行的命令是错误的。
但是,您的设置IMO存在一个更紧迫的问题 – Docker容器通常不是以这种方式工作的。 你应该做的是从主机(或你的orchestrator)运行cron服务作为一次性进程(可能使用诸如docker run
或docker-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/crontab
replaceCMD crontab -l
。
所有这些对于像ADD
, RUN
或者CMD
这样的dockerfile命令都没有什么关系,它只是Linux的基本function。