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イメージを構築。
ローカルでディレクトリの移動、削除を確認。
デプロイ。
これまで通りアプリが動いていることを確認。
参考
- クーロン(cron)をさわってみるお – Qiita
- Dockerに<none>:<none>なイメージが生まれてくる理由
- Dockerの不要なコンテナ・イメージを一括削除する方法
- Run a cron job with Docker – ekito people
- cron: can’t lock /var/run/crond.pidのエラー
- Dockerで複数デーモンを起動する手法をまとめてみる – HiLoTECH
- xargs コマンド | コマンドの使い方(Linux) | hydroculのメモ
- 【Linuxでの移動】オプション含めて紹介!mvコマンドの詳細まとめ
- ある一定以前のフォルダを削除するシェル
- find でカレントディレクトリの ” . ” ドットを対象外にするには – それマグで!
- inux – -maxdepth option after a non-option AND find: paths must precede expression – Stack Overflow