SummerEye part11 -cron設定-

前回からかなり期間が空いてしまいました。

振り返ってみると、

「Azure Web Appではpipで入れられないパッケージがあった」

「Azure Web App for Containersに移行した」

という流れでした。

 

Webジョブが使えない

それでこれまで実装できていた部分を再現していたのですが、

Azure Web Appでは使えていたWebジョブ(cron的な定期実行)がWeb App for Containersでは使えなくなっていました。

 

Dockerfile内でcron設定

以下のページを参考にディレクトリ削除のスクリプトをcrontabに登録します。

*docker内でのパスの指定に注意。

 

*crontabファイルの最終行に改行を入れるのを忘れないようにします。

 

docker build -t summereye .でdockerイメージを更新します。

 

docker run -it summereyeでdockerを起動。

 

とりあえずHello, World!表示させてみます。

 

エラー

tail: unrecognized file system type 0x794c7630 for ‘/var/log/cron.log’. please report this to bug-coreutils@gnu.org. reverting to polling

 

VOLUME /var/log/追加します。

 

最終的にはこんな感じ。

ADD crontab /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
VOLUME /var/log/

 

Flaskプロジェクトと共存

さて、調べているとDockerfile内でCMDは一回しか使えないらしい。

docker勉強不足。

 

つまり、Flaskプロジェクトを起動しながらcronを走らせるのは無理らしい。

CMDでは。

 

現状コンテナの起動時にやりたいことは以下の2つ、

  • cronの起動
  • flaskアプリの起動

 

これらをまとめてシェルスクリプトにします。

適当にstart.shとでもしておいて、Dockerfile内のCMDで叩きます。

docker run -p 5000:5000 -d summereyeでflaskアプリが動いていること、cronが実行されていることを確認しました。

なんか遠回りしている気がするけど、とりあえずよしとします。

 

定期的なファイル削除

前項ではひとまず、flaskアプリとcronを共存できることを確認しました。

肝心のcronの内容はとりあえずecho 'hoge'とでもしておきました。

ここをしっかり、ディレクトリの削除に置き換えました。

 

これでもともとAzure Web AppのWebジョブでできていたことを実行できました。

ここまでの変更分をデプロイ。

 

次にアップロードされた画像を定期的に掃除します。

ここら辺を参考に、delete-cronの中身を適当なダミーコマンドからフォルダの移動・削除コマンドに置き換えます。

 

#!/bin/sh

find /app/images -mindepth 1 -type d -mtime +2 | xargs mv -t /backup
find /backup -type d -mtime +10 | xargs rm -rf

 

これで2日以上前のディレクトリは/backupディレクトリに移動、

10日以上経ったら削除とします。

 

再度dockerイメージを構築。

ローカルでディレクトリの移動、削除を確認。

デプロイ。

 

これまで通りアプリが動いていることを確認。

 

参考

コメントを残す