在编辑文件之前不会执行 crontab(使用 Dockerfile 设置 crontab)

时间:2021-02-03 17:30:29

标签: docker ubuntu cron

在 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

2 个答案:

答案 0 :(得分:0)

常见的最佳做法是每个容器有 1 个进程。对于容器内的单个进程,在出现错误等情况时组织容器的正常关闭要容易得多。

如果您要添加 cron,您将至少有 2 个进程,因此:

  1. 您的应用内真的需要一个 cron 进程吗?例如,您可以使用 docker exec -it <yourcontainer> <required-command>
  2. 从外部定期访问您的容器
  3. 确保 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 最终会输出这个容器的命令。