在 ubuntu 机器上,我有一个使用 Dockerfile 设置的 crontab:
...
RUN apt-get update && apt-get install -y cron
...
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN systemctl enable cron
RUN touch /etc/cron.d/crontab
定时任务:
15 17 * * * root /home/misc/runSomething.sh
容器创建后它没有按计划启动,但是如果我用 vi 手动编辑文件来测试它,它会在之后工作。直到它被编辑它似乎才被拾起。有没有人知道如何解决这个问题?
请注意,所有权等并未因编辑而发生变化:
root@machine:/home/gradle/src# ls -la /etc/cron.d
...
-rw-r--r-- 1 root root 50 Feb 3 14:55 crontab
...
root@machine:/home/gradle/src# vi /etc/cron.d/crontab
...
root@machine:/home/gradle/src# ls -la /etc/cron.d
...
-rw-r--r-- 1 root root 51 Feb 3 15:42 crontab
答案 0 :(得分:0)
常见的最佳做法是每个容器有 1 个进程。对于容器内的单个进程,在出现错误等情况时组织容器的正常关闭要容易得多。
如果您要添加 cron,您将至少有 2 个进程,因此:
docker exec -it <yourcontainer> <required-command>
cron
进程在启动期间随您的应用一起启动,因此您可以使用类似
ENTRYPOINT cron && yourapp
CMD cron && yourapp
据我所知,RUN
命令只是修改文件系统层,但是,它不会启动后台进程等。
答案 1 :(得分:0)
我不知道如何使 /etc/cron.d 中的文件与 docker 一起正常工作,但我确实找到了一个解决方法,我将与其他人分享。如果有人知道如何在 docker 中使用 /etc/cron.d 文件,我将不接受我的回答。
我在这篇文章中注意到 How to run a cron job inside a docker container 这一行:
...
the files under /etc/cron.d/ are read and interpreted by cron as soon as edited
...
这让我觉得我反对的是预期的功能。
然后我相应地修改了我的搜索并找到了这个:How to run a cron job inside a docker container
所以我修改了我的 dockerfile 来设置 crontab,如下所示:
ADD crontab /home/gradle/src/crontab
RUN /usr/bin/crontab /home/gradle/src/crontab
这更容易且有效。请注意,正如@larsks 提到的,不需要“systemctl enable cron”。
我同意@DavidMaze 和@lazyhead 的观点,我不应该将“cron && gradle bootrun”作为我的命令,但这只是暂时的情况。 cron 最终会输出这个容器的命令。