我陷入困境,需要帮助。我已经在docker cloud上设置了多个堆栈。堆栈运行多个容器,如数据、mysql、web、弹性搜索等。
现在我需要在web容器上运行命令。在docker之前,我用cronjob做了这件事,例如:
*/10 * * * * php /var/www/public/index.php run my job
但是我的网络Dockerfile以结束
CMD ["apache2-foreground"]
正如我所理解的,在一个容器上运行两个命令的docker概念是不好的做法。但是,我该如何安排像上面那个cronjob那样的工作呢?
我应该也在CMD中启动cron吗?
CMD ["cron", "apache2-foreground"] ( should exit with 0 before apache starts)
我应该制作一个运行两个命令的启动脚本吗?
在我看来,最明智的解决方案是创建另一个服务,比如dockercloud haproxy服务,在那里其他服务都是链接的。
然后,cron服务将执行链接容器/堆栈的堆栈文件中定义的命令。
感谢您的帮助
对于docker,我通常看到3个选项:
- 在同一容器中运行cron进程
- 在不同的容器中运行cron进程
- 在docker之外的主机上运行cron
对于在同一容器中运行cron,您可以查看https://github.com/phusion/baseimage-docker
或者,您可以创建一个单独的容器,其中唯一运行的进程是cron守护进程。我手头没有链接,但它们是我们的。然后使用cron调用连接到其他容器,并调用要运行的内容。对于一个应该足够简单的apache容器,只需公开一些最小的http API端点,当它被调用时,它将执行您想要执行的操作(确保它不易受到任何注入的影响,即不传递任何参数,保持简单愚蠢)。
如果您也可以控制主机,那么您可以(ab)使用在那里运行的cron守护进程(我目前使用我的容器)。我不知道docker cloud,但有一件事告诉我,这可能不是你的选择。