Digdag on Dockerで何度コンテナを立て直しても状態を維持する

しました
DigdagはDocker上でタスクに依存性をもたせて処理を実行するために使用し始めました

Digdagを使うことが出来るDocker Imageは今回は自前で用意したものを使用します
※ Digdagのバージョンは0.9.10

https://hub.docker.com/r/hatappi/digdag/
ENTRYPOINTにはdigdagを指定しているので docker run hatappi/digdag init hoge みたいに使えます

例えば下記のようなワークフローを/tmp/workflow.dig にホストマシンに定義したとします

timezone: Asia/Tokyo

+setup:
  echo>: SETUP!

+echo_date:
  sh>: date

+cleanup:
  echo>: CLEANUP!

処理としては SETUP! をechoした後に date で現時刻を表示して最後にCLEANUP!と表示して完了します
docker runにてworkflow.digをコンテナ上にマウントして実行します

$ docker run -w /digdag -v /tmp/workflow.dig:/digdag/workflow.dig hatappi/digdag run workflow.dig
2017-05-11 15:35:10 +0000: Digdag v0.9.10
2017-05-11 15:35:12 +0000 [WARN] (main) io.digdag.cli.Run: Using a new session time 2017-05-12T00:00:00+09:00.
2017-05-11 15:35:12 +0000 [INFO] (main) io.digdag.cli.Run: Using session /digdag/.digdag/status/20170512T000000+0900.
2017-05-11 15:35:12 +0000 [INFO] (main) io.digdag.core.workflow.WorkflowExecutor: Starting a new session project id=1 workflow name=workflow session_time=2017-05-12T00:00:00+09:00
2017-05-11 15:35:14 +0000 [INFO] (0016@[0:default]+workflow+setup) io.digdag.core.agent.OperatorManager: echo>: SETUP!
SETUP!
2017-05-11 15:35:15 +0000 [INFO] (0016@[0:default]+workflow+echo_date) io.digdag.core.agent.OperatorManager: sh>: date
Thu May 11 15:35:15 UTC 2017
2017-05-11 15:35:17 +0000 [INFO] (0016@[0:default]+workflow+cleanup) io.digdag.core.agent.OperatorManager: echo>: CLEANUP!
CLEANUP!
Success. Task state is saved at /digdag/.digdag/status/20170512T000000+0900 directory.

そしてもう一度同じコマンドを実行したとする
digdagはそれぞれタスクが完了したかのセッション情報をもっているので本来は完了したタスクはskipされるはずですが、コンテナをたてなおすとセッション情報も保持していないので最初からの実行になってしまいます

これを解決するためにまずdigdagのセッション情報の保持の仕方を確認します
digdagのセッション情報は*.digファイルがあるディレクトリに.dig/[session_time]ディレクトリがきられそこにタスクごとに状態を保持したymlファイルが生成されておりdigdag runした際に該当時間内のsession_timeの情報があるか見に行っているようです

そのディレクトリをDockerのData Volumeを使って永続化してあげれば良さそうです

今回は任意の場所にセッションを保存したかったためdigdag runのオプションの--saveを使用して任意の場所にセッション情報を保持するようにしました
後はそのディレクトリをホストマシンにマウントしてあげるだけです

$ docker run -w /digdag -v /tmp/workflow.dig:/digdag/workflow.dig -v /tmp/dig:/digdag_session hatappi/digdag run workflow.dig --save /digdag_session

これで何回コンテナをたてなおしてもセッション情報をみてdigdag runできるようになりました