【发布时间】:2015-11-21 18:28:44
【问题描述】:
我已经使用 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 作业。最终,我需要通过 cron 做一些额外的事情。 Moodle 使用命令行 PHP 脚本。
在另一个容器中从一个容器启动脚本的“正确”泊坞化方式是什么?
更新:也许提及我的具体用例会有所帮助,尽管随着时间的推移会有更多。
目前,cron需要做以下事情:
- 从 MySQL 执行数据库转储。我可以通过 cron 容器中的 mysqldump TCP 链接做到这一点;这里的缺点是我不能将备份用户限制为主机 127.0.0.1。我还可以通过卷以某种方式将 MySQL 套接字连接到 cron 容器中。
- 对 Moodle 安装执行定期维护。 Moodle 包含一个运行所有维护任务的 php 命令行脚本。这对我来说是个大问题。我可以可能在一个卷中运行这个脚本,但 Moodle 的设计并没有考虑到这种情况,我不会排除竞争条件。另外,我不希望将 moodle 安装在卷中,因为这会使更新容器变得更加困难(请记住,在 Docker 中,使用新映像更新容器时不会重新初始化卷)。
- 未来:对我的许多其他服务器执行例行维护,例如清理电子邮件队列等。
【问题讨论】:
-
这个好主意,我没想到会这么做。不过,它似乎也遇到了同样的问题;或者有没有办法让一个容器向另一个容器发送信号?
-
在docs.docker.com/engine/reference/commandline/run查看
docker run的文档--link=[] Add link to another container -
链接在这里不起作用,因为它只允许基于网络的通信。最终目标是在目标容器中启动一个脚本,并让目标容器只运行它设计的一个进程(MySQL、Apache、Nginx)。网络通信需要让另一个进程监听来自 cron 的通信。还是我忽略了什么?