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}
参考
- Spring-Bootの設定プロパティと環境変数 - Qiita
- The Twelve-Factor App (日本語訳)
- Spring Boot 2.0.0 M1 Release Notes · spring-projects/spring-boot Wiki · GitHub
- 72. Properties & configuration
- 26. Logging
- Spring Bootのログ出力(概要) - Qiita
Bootすごい。。設定を外から渡せるのがこんなに便利だとは。。
— すーくん (@su_kun_1899) 2017年12月22日
環境に特定の名前の環境変数を入れておくとアプリがそれを使って。。ってやつより、起動引数とかオプションで環境変数を渡してあげる形の方が好き。
— すーくん (@su_kun_1899) 2017年12月22日
変数名は環境側が決めていいと思う気持ち。