どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

docker-composeでバッチを走らせたい

f:id:nogawanogawa:20190320190051p:plain
 

バッチジョブを運用したい、crontabをつかって定期実行したい。

これだけならよくある話かと思います。

今回は何を血迷ったか、docker-composeを使って、オンプレ環境で、これを実現することを考えたので、そのメモです。 誰の役に立つんだかよくわかりませんが、一応残しておきます。

参考にさせていただいたのはこちら。

qiita.com

はじめに

クラウドコンピューティングが当たり前になった今日、普通の人はDockerコンテナのバッチジョブの定期実行なんてクラウドのサービス使ったら簡単だと言うはずです。 ましてや、わざわざdocker-composeを使ってバッチ処理を回そうなんて、傍から見たらめっちゃ特殊なケースだと思ってます。 だってkubernetes使ったら普通にできるんだもん。(やり方については下記の記事などをご参考ください)

qiita.com

そこまでわかった上で、それでもdocker-composeを使ってバッチ処理を回したいという、危篤な特殊な状況に置かれた自分のためのメモです。

やりたいこと

なにがなんでもdocker-composeを使って、特定のコンテナ内のプロジェクトで構成されたバッチジョブを定期実行したいです。

考えるフロー

なんとなく、こんな感じをイメージしてます。

  1. ホスト側でcron jobが起動
  2. docker-composeでバッチジョブを起動するスクリプトが起動
  3. dockerコンテナ内でバッチジョブが起動

やってみる

コンテナの中身を準備する

今回はコンテナの中のコードについては本記事の対象外にしたいと思います。 特に解説はなく、使ったコードだけこちらにおいておきます。

github.com

docker-compose.yamlを書く

次にdocker-composeの定義を書いてきます。  

バッチジョブを実行する際のコマンドはこちらの記事を参考にさせていただきました。

qiita.com

下記のコマンドによって実行します。

$ /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を編集しないように。

理由は、こちらをご参照ください。血の気が引きます。

qiita.com

ということで書いてみるとこんな感じですかね。

これをcrontabに登録しておきます。

crontab cron.txt

これで日付が回るタイミングでjobが開始されるようになります。

感想

これをやらないといけない段階で個人的には技術選定ミスってるなーとか思ってます。 もっと簡単かつ安全にできるはずです。

それでも、docker-composeを使いたいというある種縛りプレイをやることになったので、そのメモでした。