visible true

技術的なメモを書く

IntelliJ IDEAからDocker上で動くSprint Bootアプリにdebuggerをつなぐ

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

f:id:sys1yagi:20190404163913p:plain

あとはつなぐだけ

f:id:sys1yagi:20190404164957p:plain

やったね。

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みたいなオプション渡せるといいんだけどよくわからない。