SpringBootを環境毎にいい感じに起動する #SpringBoot

Intro

SpringBootは設定をapplication.yml(properties)で管理するが、システムプロパティやコマンドライン引数で上書きすることができる。

もちろんprofileを用意して切り替える形でも良いと思うんだけど、環境依存系の設定の場合、環境変数を利用するなどして、環境側から渡してあげると使い勝手がよくなると思う。(12Factor's App的な)

個人的にはアプリケーションで指定された環境変数を入れておくよりは、環境側から引数で明示的に渡してあげるような形式が好み。

環境から渡すことが検討に値しそうなプロパティをまとめておく。

コマンド例

java -jar hogeapp.jar \
  --spring.datasource.username=${HOGEAPP_USERNAME} \
  --spring.datasource.password=${HOGEAPP_PASSWORD} \
  --spring.datasource.url=${HOGEAPP_DATASOURCE_URL} \
  --server.port=${HOGEAPP_PORT} \
  --server.servlet.context-path="/stg" \
  --logging.file="/var/log/hogeapp.log" \
  --logging.level.root=WARN \
  &

spring.datasource.*

  • spring.datasource.username
  • spring.datasource.password
  • spring.datasource.url
  • etc

DBの接続先などは環境によって変わるものだし、外から渡すことを前提にしてもよいかもしれない。

ユーザやパスワードについては管理方法次第だと思うが、アプリケーションから管理を引きはがせるメリットがある。

管理方針によっては有用な気がする。

server.port

SpringBootの起動ポートを切り替えることができる。

--server.port=9000 にした場合、 localhost:9000 で起動する。

SpringBootアプリケーションの手前にWebサーバを立てることは多いと思うので、Portの管理を環境に任せられる。

server.servlet.context-path

コンテキストパスを変更することができる。

環境の違いはドメインで表現する手も有りだと思うが、 /dev , /stg , /prd のようにコンテキストパスで表現するというのはどうだろうか。

※SpringBoot2.0でプロパティ名が変わる模様(元々は server.context-path

--logging.*

  • logging.file
  • logging.level.root

SpringBootはログを標準出力するが、logging.fileを渡すとそちらに書き出してくれる。

ローテートはデフォルトだとサイズ(10MB)でされるようだ。

levelも変更できるので、ログの管理方針によってはありかもしれない。

停止

プロセスIDでKillする。

$ pgrep -f 'hogeapp.jar'
$ kill -TERM {プロセスID}

参考