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
成为我的容器的主要进程。
我有一个 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
成为我的容器的主要进程。