現在、AWS に CoreOS クラスターがあります。クラスタは主にRailsアプリケーション用に複数のコンテナを実行します。ただし、コンテナの1つは、特定の外部APIの一括データを処理する純粋なRubyアプリケーションです。
実際、アプリケーションのDockerコンテナは毎日午前4時(UTC)で実行されます。
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
サービスによって実行されるシェルスクリプトは、次のように要約できます。
/usr/bin/docker run --rm --name=myapp omg/myapp:$tag
コンテナはCircleCIを介してクラスタにデプロイされるため、コンテナはクラスタ内のサーバーの1つに配置できます。ただし、同じサーバー上で実行されている他のコンテナがRAMを大量に消費したり、ディスクに空き容量がなくなったりして、そのコンテナを実行しているサーバーのメモリが不足すると、そのコンテナは停止して再実行されます。クラスタ内の他のサーバーにあります。
これは、1 日に 1 回だけ実行する必要があり、サーバーに障害が発生した場合に再実行してはならない Ruby アプリケーションの文脈で問題になります。
この場合、どうすればよいですか?
ありがとうございます。
答え1
コンテナの再起動/移動後も維持される方法(永続/共有ファイルシステムのファイル、データベースの一部の情報、外部調整サービス/アプリケーションなど)を使用して、独自の実行を追跡するためにアプリケーションを教える必要があります。状況に合うものは何でも可能です。 )。
再起動後にアプリケーションが指定された間隔内で実行されたことを検出すると、何も実行せずに終了します。それ可能必要に応じて、以前に完了していなかったタスクを選択して完了するように教えることもできます。 :)
アプリケーション内でこれを実行できない場合は、アプリケーションをカスタムラッパーでラップし、ラッパー内で実行できます。