Docker 容器中 运行 计划的 cron 作业的解决方案?

Solution for running scheduled cron job within a Docker container?

我有一个 Docker 容器,其中安装了我的 Python 工具,包括我的 Luigi 管道接口。我想要 运行 一个 shell 脚本,每周使用 cron 启动我的 Luigi 管道。

我尝试了很多方法来让 cron 在 Docker 容器中工作。在我的一生中,我无法将我的 crontab -e 文件设置为 运行.

在我的文件中有:

0 0 * * Sun /data/myscript.sh

后跟一个新行。 Cron 在后台 运行ning - ps aux | grep cron 显示 /usr/sbin/cron 正在 运行ning。此外,在我的 /var/log/syslog 文件中,我有:

/USR/SBIN/CRON[2037]: (root) CMD (/data/myscript.sh)

我也试过使用 0 0 * * Sun . /root/.bashrc ; sh /data/myscript.sh

但是,我的脚本没有 运行(当我 运行 我的脚本手动使用 bash myscript.sh 时,我得到了预期的结果)。

建议?

计划任务不会 运行 在普通容器内,因为没有调度程序 运行ning。唯一的活动任务将是您通过 CMD 关键字或入口点选择 运行 的任务。

为了执行调度任务,使用主机调度程序和docker exec 命令更为谨慎:

docker exec <container> <command>
docker exec <container> /data/myscript.sh

所以你最终会在你的主机上有一个 cron,比如:

(Crontab 样式) 0 * * * * root docker exec mycontainer /data/myscript.sh

如果你有一个集群,你必须先查询集群来定位容器,或者甚至让脚本为你做这件事。

一个容器只能用于一个 运行 主进程。您要么需要 运行 crond 作为容器的主进程,要么确保 crond 与您的主进程一起 运行ning。这种破坏了容器的契约/点,但有时以这种方式设置它更容易。以下说明:

我的 Dockerfile 具有以下 ENTYPOINT:

ENTRYPOINT ["/startup.sh"]

然后在 startup.sh 内我做了一些事情来启动容器,但最重要的是在执行最后一个命令之前,我有这个:

crond
exec start_my_service

crond 启动执行 cron 的守护进程,然后 start_my_service 成为我的容器的主要进程。