リモートのDockerで動作するJavaアプリケーションをデバッグする方法

リモートのDockerで動作するJavaアプリケーションをデバッグする方法

なぜリモートのDockerでデバッグしたいのか

Docker for Macの動作が重く、変更の反映や再起動に時間がかかる状態であったため、EC2インスタンスに立てたDockerでデバッグ実行をしたくなりました。IntelliJ IDEAのリモートデバッグという機能を使うと可能になります。具体的な設定方法をご紹介いたします。

IntelliJ IDEA側の設定

IntelliJ IDEAのRun/Debug Configurationを設定することでデバッグ実行することができます。

リモートのホストを設定

Runタブから「Edit Configurations...」 を選択します。

「Configuration」の「Host」にリモートのホストのIPアドレスを入力します。

アプリケーション起動コマンドのオプションを指定

「Command line arguments for remote JVM」の内容をコピーします。(後ほどコンテナ側の設定で必要)

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

以上で、IDE側の設定が完了です。

コンテナの設定

先程コピーした値を、実行対象プロジェクトの build.gradle のbootRunコマンドに対して以下のように指定します。

  • build.gradle
    bootRun {
    jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
    }

次に、5005番ポートを開放します。
以下はdocker-composeを利用している場合の設定になります。

  • docker-compose.yml
    ports:
      - 8080:8080
      - 5005:5005

セキュリティグループの設定

最後にセキュリティグループで、
8080、5005番ポート へのアクセスを許可してください。

以上の設定で全て完了です。

以降はローカルでの実行同様、ブレークポイントをセットし、デバッグ実行を行うとそこで停止してくれます!

まとめ

意外と簡単な設定でデバッグ実行ができたので、とても便利でした。
もちろん、localhostを指定することでローカルで起動しているDockerに対しても利用することができます。ぜひ試してみてください。

公式ドキュメント

https://www.jetbrains.com/help/idea/debug-a-java-application-using-a-dockerfile.html