🐼

SpringBoot3✖️Docker環境でデバッグする方法(IntelliJ IDEA)

2023/12/08に公開

はじめに

SpringBoot3をDocker環境で構築した際のIntelliJIDEAでのデバッグ方法が分からず、苦戦したので書き残します。😇

環境について

  • Java 17
  • SpringBoot 3.1.5
  • Gradle 8.3

手順

手順としてはSpringBoot実行時(bootRun)にjvmArgsを渡して実行すると起動前に接続を受け付けてくれるようになるので、IntelliJIDEAからリモートJVMデバッグで接続することでデバッグ可能となります。😊

具体的手順を記載します。

  1. SpringBoot起動時にjvmArgsを渡して実行するようにbuild.gradleに以下を追記します。
build.gradle
bootRun {
	jvmArgs -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
}
  1. SpringBootを起動します。
    docker-composeを使用しているので以下コマンドで起動します。
docker-compose up -d

起動後ログを確認すると接続待ち状態になっていると思います。

  1. IntelliJIDEAからリモートJVMデバッグで接続します。
    1. 実行構成の編集を開きます。 実行→実行構成の編集...
    2. 実行構成の編集ダイアログ左上の「+」から「リモートJVMデバッグ」を選択します。
    3. 必要項目を記載し、デバッグを押下して実行します。

      ホスト:localhost
      ポート(P):5005
      コマンドライン引数:
      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
      クラスパス:プロジェクトフォルダ

これでSpringBootが起動するので、ブレークポイントを打てばデバックができるようになります。

補足

今のままだとSpringBootを起動すると必ずdebug実行になってしまいますが、通常実行とdebug実行を切り替えることもできます。
jvmArgsで渡す引数をDocker環境の環境変数に登録し、対象の環境変数があればjvmArgsで引数を渡すというようにすればdebug実行と通常の実行の切り替えができます。👏

それでは具体的手順です。

  1. docker-compose-debug.ymlを作成し、jvmArgsで渡す引数をDocker環境の環境変数に登録する。
docker-compose-debug.yml
services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        WORKDIR: ${WORKDIR}
    env_file:
      - ./environment/api-variables.env
    environment:
      ORG_GRADLE_PROJECT_debug: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
    tty: true
    command: ./gradlew clean bootRun
    volumes:
      - .:/${WORKDIR}
    ports:
      - "8080:8080"
      - "5005:5005"
    depends_on:
      - db

重要なのはここです。
docker-composeのenviromentで定義することで環境変数に登録することができます。

    environment:
      ORG_GRADLE_PROJECT_debug: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
  1. 環境変数の有無でdebug実行するようにbuild.gradleを編集します。
build.gradle
bootRun {
	jvmArgs project.findProperty('debug') ?: ''
}

ORG_GRADLE_PROJECT_debugという環境変数を登録するとproject.findProperty('debug')で値を取得することができます。
つまり、ORG_GRADLE_PROJECT_hogeで登録するとproject.findProperty('hoge')で取得することができます。

  1. SpringBootを起動する。
    docker-composeコマンドで実行するファイルを切り替えることでdebug実行と通常の実行を切り替えます。
  • 通常の実行
docker-compose up -d
  • debug実行
docker-compose -f docker-compose-debug.yml up -d

-f ファイルを指定するオプション

まとめ

今回はSpringBoot3✖️Docker環境でIntelliJ IDEAを使ってデバッグする方法を記載しました。
GradleとMavenでやり方が異なってきますし、どのIDEかによってやり方は違うと思います。
また、Javaのバージョンにより、jvmArgsで渡す引数も異なるようなので注意してください。(9以降であれば今回の引数で問題ないです。)
Dockerなど今まで使ったことがない新しい技術を使おうとするとつまづくことがいっぱいですが、一つずつクリアしていきたいです😌

Discussion