我目前在 AWS 上有一个 CoreOS 集群。集群运行多个容器,主要用于Rails应用程序。然而,其中一个容器是一个纯 Ruby 应用程序,用于处理来自特定外部 API 的大量数据。
实际上,该应用程序的 Docker 容器每天凌晨 4 点(世界标准时间)运行。
myapp.service:
[Unit]
Description=MyApp service
Requires=docker.service
[Service]
ExecStart=/home/core/sc/myapp_start.sh
User=core
myapp.timer:
[Unit]
Description=MyApp Timer
Requires=docker.service
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
服务执行的 shell 脚本可以总结为:
/usr/bin/docker run --rm --name=myapp omg/myapp:$tag
由于容器是通过 CircleCI 部署到集群的,因此容器可以位于集群中存在的服务器之一上。但是,如果运行容器的服务器由于同一服务器上运行的另一个容器并占用大量 RAM 而耗尽内存,或者磁盘上没有可用空间等,则容器将停止并再次运行集群的另一台服务器。
在 Ruby 应用程序的上下文中,这是有问题的,该应用程序应该每天只运行一次,并且在服务器出现故障时不应再次运行。
在这种情况下,我该怎么办?
谢谢。
答案1
您需要教您的应用程序使用一种在容器重新启动/移动后仍然存在的方法来跟踪其自身的执行(可以是持久/共享文件系统上的文件、数据库中的一些信息、一些外部协调服务/应用程序等 -任何适合您的上下文的内容)。
重新启动后,如果应用程序发现它已经在指定的时间间隔内执行,那么它将退出而不执行任何操作。它可能如果需要的话,甚至可以教它接起并完成之前未完成的工作:)
如果无法在应用程序内部执行此操作,那么您可以将应用程序包装在自定义包装器中,然后在包装器内部执行此操作。