我已经使用Docker几个月了,并且正在将各种不同的服务器映像Docker化。一个一致性的问题是许多服务器需要运行cron作业。关于这个问题有很多在线讨论(包括在Stackoverflow上),但我并不完全理解其机制。
目前,我正在使用主机的cron,并且通过docker exec进入每个容器来运行脚本。我为脚本的名称和位置创建了一个约定;所有我的容器都有相同的脚本。这避免了主机的cron依赖于容器。
基本上,每分钟一次,主机的cron会执行以下操作:
for each container
docker exec -it <containername> /cronscript/minute-script
这样做可以实现,但会使容器依赖主机。
我想要做的是创建一个cron容器,在其他容器中启动脚本 - 但我不知道有没有类似于“docker exec”的东西可以从一个容器到另一个容器中运行。
我目前遇到的具体情况是在MySQL容器中运行备份,并在每分钟运行Moodle所需的定时任务。最终,我还需要通过cron完成其他事情。Moodle使用命令行PHP脚本。
从一个容器中启动另一个容器中的脚本的正确docker化方法是什么?
更新: 可能我的具体用例会有所帮助,尽管随着时间的推移,可能还会有更多。
目前,cron需要执行以下操作:
- 从MySQL执行数据库转储。我可以通过mysqldump TCP链接从cron容器中进行操作;这里的缺点是我无法将备份用户限制为127.0.0.1主机。我也许还可以通过卷来将MySQL套接字弄进cron容器。
- 对Moodle安装执行常规维护。Moodle包括一个php命令行脚本,可运行所有维护任务。对我来说,这是最重要的。我可能可以通过卷运行此脚本,但Moodle并不是为这种情况而设计的,我不能排除竞态条件。此外,我不希望将我的moodle安装在卷中,因为这会使更新容器变得更加困难(请记住,在Docker中,当您使用新镜像更新容器时,卷不会重新初始化)。
- 未来:对我其他几台服务器执行日常维护,例如清理电子邮件队列等。
docker run
的文档--link=[] 将另一个容器链接到当前容器
。 - user2915097volumes_from
。这使您可以在不同的容器中运行计划任务(与链接相同的想法,但不同的机制)。卷的名称(或容器,如果您正在使用 volumes_from)可以作为 crontab 条目的一部分包含在其中。 - dnephin