バッチジョブを運用したい、crontabをつかって定期実行したい。
これだけならよくある話かと思います。
今回は何を血迷ったか、docker-composeを使って、オンプレ環境で、これを実現することを考えたので、そのメモです。 誰の役に立つんだかよくわかりませんが、一応残しておきます。
参考にさせていただいたのはこちら。
はじめに
クラウドコンピューティングが当たり前になった今日、普通の人はDockerコンテナのバッチジョブの定期実行なんてクラウドのサービス使ったら簡単だと言うはずです。 ましてや、わざわざdocker-composeを使ってバッチ処理を回そうなんて、傍から見たらめっちゃ特殊なケースだと思ってます。 だってkubernetes使ったら普通にできるんだもん。(やり方については下記の記事などをご参考ください)
そこまでわかった上で、それでもdocker-composeを使ってバッチ処理を回したいという、危篤な特殊な状況に置かれた自分のためのメモです。
やりたいこと
なにがなんでもdocker-composeを使って、特定のコンテナ内のプロジェクトで構成されたバッチジョブを定期実行したいです。
考えるフロー
なんとなく、こんな感じをイメージしてます。
- ホスト側でcron jobが起動
- docker-composeでバッチジョブを起動するスクリプトが起動
- dockerコンテナ内でバッチジョブが起動
やってみる
コンテナの中身を準備する
今回はコンテナの中のコードについては本記事の対象外にしたいと思います。 特に解説はなく、使ったコードだけこちらにおいておきます。
docker-compose.yamlを書く
次にdocker-composeの定義を書いてきます。
バッチジョブを実行する際のコマンドはこちらの記事を参考にさせていただきました。
下記のコマンドによって実行します。
$ /usr/local/bin/docker-compose run --rm -T --name `uuidgen` gokart python3 main_gokart.py
docker-composeのコマンドを実行するshellscriptを書く
cronにdocker-composeのコマンドをキックさせてもいいんですが、shellscriptで書いといたほうがcronの直接編集を回避できるので動作確認をやりやすいかと思います。なので、shellscriptを書いときます。
#!/bin/bash /usr/local/bin/docker-compose run --rm -T --name `uuidgen` gokart python3 main_gokart.py
crontabを書く
まあ普通にcron書いたらいいと思います。 ただし、このとき間違っても直接cronを編集しないように。
理由は、こちらをご参照ください。血の気が引きます。
ということで書いてみるとこんな感じですかね。
これをcrontabに登録しておきます。
crontab cron.txt
これで日付が回るタイミングでjobが開始されるようになります。
感想
これをやらないといけない段階で個人的には技術選定ミスってるなーとか思ってます。 もっと簡単かつ安全にできるはずです。
それでも、docker-composeを使いたいというある種縛りプレイをやることになったので、そのメモでした。