IntelliJからdocker上で動いてるSpring Bootアプリにデバッガつなぎたいときってありますよね。 ドチャクソハマったのでメモします。
Dockerで動かすSpring Bootアプリでデバッグ用ソケットを起動する
gradleを使っている前提です。
gradleでSpring Bootを起動するタスクはbootRun
です。
これに--debug-jvm
オプションを付与すると、5005番でデバッグを受け付けてくれます。
docker-composeの設定イメージは次です。
version: '3' services: app: image: openjdk:8 container_name: TodoList ports: - 8080:8080 - 5005:5005 # デバッグ用ポートも開けてあげる command: ./gradlew app:bootRun --debug-jvm # このオプションをつける
これでdocker-compse upするとサーバ起動前に5005番で待ち受けてくれます。
IntelliJのRemote Configurationで5005番に接続する
Edit ConfigurationでRemote Configurationを追加する。デフォルトで5005番なのでそのままでOK
あとはつなぐだけ
やったね。
handshake failed - connection prematurally closedが出る時は
localだとつながるのにDocker経由だとこんなエラーでてつながらない現象に苦しみました。
Error running 'debug': Unable to open debugger port (localhost:5005): java.io.IOException "handshake failed - connection prematurally closed"
原因はいろいろあるみたいですが、とりあえず自分の環境で起きた原因は、IntelliJの動作で使っているJVMと、Docker上で動いているJVMのバージョンが異なるからでした。
docker-composeで利用するimageをopenjdk:10
からopenjdk:8
にしたら繋げられました。
やったね。
おわりに
毎回5005番を待ち受けるのでsuspend=nみたいなオプション渡せるといいんだけどよくわからない。