関わっているプロジェクトでdockerを使っているのですが、プロダクト内(scala)に単独実行可能なバッチスクリプトを入れ込んだ際、dockerのコマンド経由でそのバッチだけを起動する方法がわからなくてハマったのでメモ。
バッチのjar起動時にはいつもclasspathの指定で起動していたが、dockerで生成された起動スクリプト(bin/hoge-app
)の-main
オプションを指定すれば同じことができるっぽい。
dockerのイメージはsbtのsbt-native-packagerで生成してます。
試しにローカルで実行
# sbtからdocker imageをビルド
$ sbt docker:stage
$ sbt docker:publishLocal
# プロジェクト内に生成されたdocker imageへ移動
$ cd target/docker/stage/opt/docker
$ bin/hoge-app -main hoge.batch.FugaBatchLauncher # クラスパスを指定
サーバ環境側で実行
# サーバ環境ではGCPのCONTAINER REGISTRYでコンテナを管理しているのでプルしてくる
$ gcloud docker -- pull gcr.io/hoge-app:1.0
# 起動。mysqlと接続のためにlinkを指定。/bin/bashにて起動オプションなどを指定。
$ docker run --rm -p 9000:9000 --link mysqld:mysql-container gcr.io/hoge-app:1.0 /bin/bash -c "bin/hoge-app -Dconfig.resource=application.conf -Dlogback.configurationFile=logback.xml -main hoge.batch.FugaBatchLauncher"
あとは上記、起動スクリプトをcronに指定すればバッチ起動できそう